κΈ€ μž‘μ„±μž: λ˜₯폴베.
λ°˜μ‘ν˜•
이 ν¬μŠ€νŠΈλŠ”, μœ€μ„±μš° μ €μžλ‹˜μ˜ 'λ‡Œλ₯Ό μžκ·Ήν•˜λŠ” μœˆλ„μš°μ¦ˆ μ‹œμŠ€ν…œ ν”„λ‘œκ·Έλž˜λ°'을 λ°”νƒ•μœΌλ‘œ 제 생각을 μž¬κ΅¬μ„±ν•˜μ—¬ μ •λ¦¬ν•œ ν¬μŠ€νŠΈμž…λ‹ˆλ‹€.


λͺ©μ°¨


  • λ¬Έμžμ…‹μ˜ μ’…λ₯˜μ™€ νŠΉμ„±
  • WBCS 기반의 ν”„λ‘œκ·Έλž˜λ°
  • λ§€κ°œλ³€μˆ˜ μ „λ‹¬μΈμž μœ λ‹ˆμ½”λ“œν™”

 

λ¬Έμžμ…‹μ˜ μ’…λ₯˜μ™€ νŠΉμ„±


 λ¬Έμžμ…‹μ΄λž€? 문자의 집합이닀. 문자λ₯Ό μ–΄λ–»κ²Œ ν‘œν˜„ν•˜λŠλƒ? ν‘œν˜„ν•˜λŠ” 방법에 μžˆμ–΄ 크게 3κ°€μ§€λ‘œ λ‚˜λ‰œλ‹€.

  • SBCS(Single Byte Character Set)
    • 문자λ₯Ό ν‘œν˜„ν•˜λŠ”λ° 1λ°”μ΄νŠΈ μ‚¬μš©ν•œλ‹€
    • μ•„μŠ€ν‚€μ½”λ“œλŠ” SBCSλ‹€
  • MBCS(Multi Byte Character Set)
    • ν•œκΈ€μ€ 2λ°”μ΄νŠΈ, μ˜λ¬Έμ€ 1λ°”μ΄νŠΈ μ‚¬μš©ν•˜λŠ” ν˜•νƒœλ‹€
  • WBCS(Wide Byte Character Set)
    • SBCS보닀 2λ°° λ„“κ²Œ ν‘œν˜„ν•œλ‹€
    • 문자λ₯Ό ν‘œν˜„ν•˜λŠ”λ° 2λ°”μ΄νŠΈλ₯Ό μ‚¬μš©ν•œλ‹€
    • μœ λ‹ˆμ½”λ“œλŠ” WBCSλ‹€

 μš°λ¦¬λŠ” λŒ€ν•œλ―Όκ΅­μ—μ„œ μ‚΄κ³  있기 λ•Œλ¬Έμ—, μ†Œν”„νŠΈμ›¨μ–΄μ—μ„œλ„ ν•œκΈ€μ„ 지원해야 ν•œλ‹€.

ν•œκΈ€μ„ μ§€μ›ν•˜λŠ” λ¬Έμžμ…‹μ„ μ‚΄νŽ΄λ³΄λ©΄ MBCS와 WBCSκ°€ μžˆλŠ”λ°..

MBCSλŠ” ν•œκΈ€μ€ 2λ°”μ΄νŠΈ, μ˜λ¬Έμ€ 1λ°”μ΄νŠΈλ₯Ό μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— μ–Έλœ» 보기엔 효율적으둜 보일 수 μžˆλ‹€.

ν•˜μ§€λ§Œ μš”μ¦˜ 같은 μ‹œλŒ€μ—” μ—„μ²­λ‚˜κ²Œ κΈ΄ λ¬Έμž₯이 μ•„λ‹Œ 이상 1λ°”μ΄νŠΈλ₯Ό μ€„μ˜€λ‹€κ³  ν•΄μ„œ κ·Έλ ‡κ²Œ μΉ­μ°¬ν• λ§Œν•  일은 μ•„λ‹ˆλ‹€.

κ·Έλž˜μ„œ λ“±μž₯ν•œ 것이 μœ λ‹ˆμ½”λ“œλ‹€. μœ λ‹ˆμ½”λ“œ(WBCS)λŠ” ν•œκΈ€μ΄λ˜ 영문이던 2λ°”μ΄νŠΈλ₯Ό μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— MBCS보닀 μ•ˆμ •μ μ΄λ‹€.

 

 κ·ΈλŸ¬λ©΄ MBCSκΈ°λ°˜μ—μ„œ 문자λ₯Ό ν‘œν˜„ν•  λ•Œ μ–΄λ–€ 문제점이 μžˆλŠ”μ§€ μ•„λž˜ 예제λ₯Ό 톡해 μ‚΄νŽ΄λ³΄μž.

[예제 1]

int main(void)
{
	char str[] = "ABCν•œκΈ€";
    int size = sizeof(str)
    int len = strlen(str);
    
    printf("λ°°μ—΄μ˜ 크기: %d\n", size);
    printf("λ¬Έμžμ—΄ 길이: %d\n", len);
    
    return 0;
}

[μ‹€ν–‰ κ²°κ³Ό]

λ°°μ—΄μ˜ 크기: 8
λ¬Έμžμ—΄μ˜ 길이: 7

 strλŠ” ABCλŠ” 영문이기 λ•Œλ¬Έμ— 1byte * 3 = 3, ν•œκΈ€μ€ ν•œκΈ€μ΄κΈ° λ•Œλ¬Έμ— 2byte * 2 = 4, nullλ¬ΈμžκΉŒμ§€ 포함해

λ°°μ—΄μ˜ ν¬κΈ°λŠ” 3 + 4 + 1 = 8이 λ‚˜μ˜¨λ‹€.

그런데, λ¬Έμžμ—΄μ˜ κΈΈμ΄λŠ” "ABCν•œκΈ€"은 λ‹€μ„― κΈ€μžκΈ° λ•Œλ¬Έμ— 5κ°€ λ‚˜μ™€μ•Ό μ •μƒμ΄μ§€λ§Œ μ™œ 7이 λ‚˜μ™”μ„κΉŒ?

ν•œκΈ€μ„ ν•˜λ‚˜λ‹Ή λ¬Έμžμ—΄ 길이 2라고 인식해 λ¬Έμžμ—΄μ˜ 길이가 3 + (2 * 2) = 7둜 λ‚˜μ˜¨ 것이닀.

 

[예제 2]

int main(void)
{
	char str[] = "ν•œκΈ€μž…λ‹ˆλ‹€";
    int i;
    
    for(i = 0; i < 5; i++)
    {
    	fputc(str[i], stdout);
    }
    fputs("\n", stdout);
    
    for(i = 0; i < 10; i++)
    {
    	fputc(str[i], stdout);
    }
    fputs("\n", stdout);
    return 0;
}

[μ‹€ν–‰ κ²°κ³Ό]

ν•œκΈ€
ν•œκΈ€μž…λ‹ˆλ‹€

예제 1κ³Ό λ™μΌν•œ 이유둜 ν•œκΈ€μ„ 2λ°”μ΄νŠΈλ‘œ μΈμ‹ν•˜κΈ° λ•Œλ¬Έμ— for 루프λ₯Ό 돌릴 λ•Œ μœ„μ™€ 같은 μ‹€ν–‰ κ²°κ³Όλ₯Ό 보인닀.

 

WBCS 기반의 ν”„λ‘œκ·Έλž˜λ°


  • WBCSλ₯Ό μœ„ν•œ 두 가지
    • 첫째: charλ₯Ό λŒ€μ‹ ν•˜λŠ” wchar_t
    • λ‘˜μ§Έ: "ABC"λ₯Ό λŒ€μ‹ ν•˜λŠ” L"ABC"
  • WBCS κΈ°λ°˜ λ¬Έμžμ—΄ μ„ μ–Έ 예
    • wchar_t str[] = L"ABC";

 

 κ·Έλ ‡λ‹€λ©΄ λΆˆμ•ˆμ •ν•œ MBCS λŒ€μ‹  WBCS κΈ°λ°˜μ˜ ν”„λ‘œκ·Έλž˜λ°μ„ ν•˜λ €λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Ό ν•  까? μœ„μ—μ„œμ˜ 두 가지λ₯Ό κΈ°μ–΅ν•˜λ©΄ λœλ‹€.

1. μš°λ¦¬κ°€ 일반적으둜 μ‚¬μš©ν•˜λŠ” char의 μžλ£Œν˜• λŒ€μ‹  wchar_tλ₯Ό μ‚¬μš©ν•˜λ©΄ λœλ‹€.

wchar_t μžλ£Œν˜• 같은 경우 λ‚―μ„€κ²Œ 느껴질 수 μžˆλŠ”λ°, μš°λ¦¬κ°€ μ •μ˜ν•œ μžλ£Œν˜•μ΄ μ•„λ‹Œ ANSIμ—μ„œ μ œκ³΅ν•˜λŠ” ν‘œμ€€ μžλ£Œν˜•μ΄λ‹€.

차이점이 μžˆλ‹€λ©΄ charλŠ” 1λ°”μ΄νŠΈ, wchar_tλŠ” 2λ°”μ΄νŠΈλ₯Ό μ‚¬μš©ν•œλ‹€.

2. "ABC"λŠ” μ•”λ¬΅μ μœΌλ‘œ 'μ•„μŠ€ν‚€μ½”λ“œ 기반으둜 λ¬Έμžμ—΄μ„ μ„ μ–Έν•˜κ² λ‹€.'λΌλŠ” μ˜λ―Έλ‹€.

λ°˜λ©΄μ— L"ABC"λŠ” 'μœ λ‹ˆμ½”λ“œ 기반으둜 λ¬Έμžμ—΄μ„ μ„ μ–Έν•˜κ² λ‹€.'λΌλŠ” μ˜λ―Έλ‹€.

 

[예제 3]

int main(void)
{
	wchar_t str[] = L"ABC";
    int size = sizeof(str);
    int len = strlen(str);
    
    printf("λ°°μ—΄μ˜ 크기: %d \n", size);
    printf("λ¬Έμžμ—΄ 길이: %d \n", len);
    
    return 0;
}

 μœ„μ˜ μ˜ˆμ œκ°€ μ •μƒμ μœΌλ‘œ λ™μž‘ν• κΉŒ? 정닡은 μ•„λ‹ˆλ‹€. μ»΄νŒŒμΌμ‘°μ°¨ λ˜μ§€ μ•ŠλŠ”λ‹€.

μ΄μœ λŠ” sizeofλŠ” ν• λ‹Ήλœ λ©”λͺ¨λ¦¬μ˜ 크기λ₯Ό μ–»λŠ” ꡬ문이기 λ•Œλ¬Έμ— μœ λ‹ˆμ½”λ“œ/μ•„μŠ€ν‚€μ½”λ“œκ°€ 상관없닀.

ν•˜μ§€λ§Œ, strlen 같은 κ²½μš° 인자둜 받은 λ¬Έμžμ—΄μ˜ 길이λ₯Ό λ°˜ν™˜ν•΄μ£ΌλŠ” ν•¨μˆ˜μΈλ° char*νƒ€μž…μ˜ 인자λ₯Ό λ°›λŠ” ν•¨μˆ˜λ‹€.

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— wchar_t* νƒ€μž…μ˜ 자료λ₯Ό strlen에 μ „λ‹¬ν–ˆκΈ° λ•Œλ¬Έμ— 컴파일 였λ₯˜κ°€ 생긴 것이닀.

 

[ν‘œ 1] λ¬Έμžμ—΄ μ‘°μž‘ ν•¨μˆ˜

SBCS ν•¨μˆ˜ WBCS 기반의 λ¬Έμžμ—΄ μ‘°μž‘ ν•¨μˆ˜
strlen size_t wcslen(const wchar_t* string);
strcpy wchar_t* wcscpy(wchar_t* dest, const wchar_t* src);
strncpy wchar_t* wcsncpy(wchar_t* dest, const wchar_t* src, size_t cnt);
strcat wchar_t* wcscat(wchar_t* dest, const wchar_t* src);
strncat wchar_t* wcsncat(wchar_t* dest, const wchar_t* src, size_t cnt);
strcmp int wcscmp(const wchar_t* s1, const wchar_t* s2)
strncmp int wcsncmp(const wchar_t* s1, const wchar_t* s2, size_t cnt);

 

[예제 4] 예제 3의 μœ λ‹ˆμ½”λ“œ 버전

int main(vodi)
{
	wchar_t str[] = L"ABC";
    int size = sizeof(str);
    int len = wsclen(str);
    
    printf("λ°°μ—΄μ˜ 크기: %d \n", size);
    printf("λ¬Έμžμ—΄ 길이: %d \n"), len);
    
    return 0;
}

[μ‹€ν–‰κ²°κ³Ό]

λ°°μ—΄μ˜ 크기: 8
λ¬Έμžμ—΄ 길이: 3

 κ²°κ³ΌλŠ” μ •μƒμ μœΌλ‘œ 좜λ ₯λ˜μ§€λ§Œ 아직 μœ„μ˜ μ½”λ“œλŠ” λ¬Έμ œκ°€ μžˆλ‹€.

μœ λ‹ˆμ½”λ“œ 기반 ν”„λ‘œκ·Έλž˜λ°μ„ ν•˜λ €λ©΄ μ²˜μŒλΆ€ν„° λκΉŒμ§€ μœ λ‹ˆμ½”λ“œλ₯Ό μ‚¬μš©ν•΄μ„œ 톡일성을 μœ μ§€μ‹œμΌœμ£ΌλŠ” 것이 쒋은데,

μœ„μ˜ μ˜ˆμ œλŠ” printfν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜κ³  μžˆλŠ”λ° 인자둜 μ—­μ‹œ μ•„μŠ€ν‚€μ½”λ“œ λ¬Έμžμ—΄μ„ μ „λ‹¬ν•œλ‹€.

 

[ν‘œ 2] λ¬Έμžμ—΄ μž…μΆœλ ₯ ν•¨μˆ˜

SBCS ν•¨μˆ˜ WBCS 기반의 λ¬Έμžμ—΄ μ‘°μž‘ ν•¨μˆ˜
printf int wprintf(const wchar_t* format [, argument]...);
scanf int wscanf(const wchar_t* format [, argument]...);
fgets wchar_t fgetws(wchar_t* string, int n, FILE* stream);
fputs int fputws(const wchar_t* string, FILE* stream);

문제 해결을 μœ„ν•΄ WBCS 기반의 λ¬Έμžμ—΄ μž…μΆœλ ₯ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ λœλ‹€.

 

λ§€κ°œλ³€μˆ˜ 전달 인자 μœ λ‹ˆμ½”λ“œν™”


 [예제 5] 예제 4의 μœ λ‹ˆμ½”λ“œ 버전

int main(void)
{
	wchar_t str[] = L"ABC";
    int size = sizeof(str);
    int len = wsclen(str);
    
    wprintf(L"λ°°μ—΄μ˜ 크기: %d \n", size);
    wprintf(L"λ¬Έμžμ—΄ 길이: %d \n"), len);
    
    return 0;
}

[μ‹€ν–‰κ²°κ³Ό]

λ°°μ—΄μ˜ 크기: 8
λ¬Έμžμ—΄ 길이: 3

 μ™„λ²½ν•˜κ²Œ μœ λ‹ˆμ½”λ“œ 기반으둜 ν”„λ‘œκ·Έλž˜λ°ν•œ 것 κ°™μ§€λ§Œ μ—¬μ „νžˆ λ¬Έμ œκ°€ λ‚¨μ•„μžˆλ‹€.

main에 μ „λ‹¬λ˜λŠ” λ§€κ°œλ³€μˆ˜ 인자 같은 경우 μ—¬νƒœκΉŒμ§€ SBCS κΈ°λ°˜μœΌλ‘œ μΈμžκ°€ λ„˜μ–΄μ™”μ—ˆμ§€ μœ λ‹ˆμ½”λ“œ κΈ°λ°˜μœΌλ‘œ λ„˜μ–΄μ˜¨ κ²½μš°λŠ” λ“œλ¬Όλ‹€.

 

[κ·Έλ¦Ό 1] 인자 μ „λ‹¬μ˜ 차이

mainν•¨μˆ˜λ₯Ό λŒ€μ‹ ν•΄μ„œ wmainν•¨μˆ˜λ₯Ό μ„ μ–Έν•˜λ©΄ λ§€κ°œλ³€μˆ˜μ˜ μΈμžλŠ” λͺ¨λ‘ μœ λ‹ˆμ½”λ“œ 기반의 λ¬Έμžμ—΄λ‘œ λ“€μ–΄μ˜¨λ‹€.

 

[예제 5]

int wmain(int argc, wchar_t* argv[])
{
	for(int i=1; i<argc; i++)
    {
    	fputws(argv[i], stdout);
        fputws(L"\n", stdout);
    }
    
    return 0;
}

[μ‹€ν–‰ κ²°κ³Ό]

AAA
BBB
CCC
λ°˜μ‘ν˜•