[νΌμ΄] L 리ν°λ΄κ³Ό μ λμ½λ μΈμ½λ©
L 리ν°λ΄κ³Ό μ λμ½λ μΈμ½λ©
c++μμ λ¬Έμλ₯Ό μ μ₯νκΈ° μν΄ 8 λΉνΈ ν¬κΈ°μ char νμ
μ΄μΈμ 16 λΉνΈ ν¬κΈ°(μλμ°μμλ 16 λΉνΈλ₯Ό μ λμ€ κ³μ΄μμλ 32 λΉνΈλ₯Ό μ¬μ©νλ€κ³ ν©λλ€.)μ μμ΄λ μΊλ¦ν°λ₯Ό μ μ₯νλ wchar_t νμ
μ μ 곡νκ³ μμ΅λλ€. wchar_t νμ
μλ λ¬Έμμ MBCS/DBCS λ° UCSUTF-16(μλμ°μμλ little endianμ κΈ°λ³Έμ μΌλ‘ μ¬μ©ν©λλ€.) μΈμ½λ©μ μ μ₯ν μ μμ΅λλ€. λ, wchar_tμ ν¨κ» μμ΄λ μΊλ¦ν°/λ¬Έμμ΄ μμλ₯Ό μ§μ νκΈ° μν΄ βLβμ μ¬μ©ν©λλ€.
λ¬Έμμ΄μ μΈμ½λ©μ μννΈμ¨μ΄μ globalization μ μν΄ νμν μ¬λ¬ μ΄μμ€ νλλ‘ MSDN λ° κ΅¬κΈ κ²μμ ν΅ν΄ μ΄ λ΄μ©μ λ€λ£¨λ λ§μ μΉ νμ΄μ§λ₯Ό κ²μν΄ λ³Ό μ μμ΅λλ€. κ·Έ μ€ μ λμ½λμ μΊλ¦ν° μ
μ μ΄ν΄λ₯Ό κ°λ°μμ νμνλͺ©μΌλ‘ μ§μ νκ³ μλ Joel Spolskyμ κΈμ 보λ κ²μ΄ λμμ΄ λ λ―ν©λλ€. μ΄ κΈμ μΌλ§μ jrogueλμ΄ λ²μν βμ‘°μ μ¨ μννΈμ¨μ΄βλ₯Ό ν΅ν΄ νκΈλ‘λ μ½μ΄ λ³Ό μ μμ΅λλ€.
λ The Complete Guide to C++ Strings, Part I - Win32 Character Encodings λ μ°Έκ³ ν λ§ν λ¬Έμμ
λλ€. μ΄ λ¬Έμλ νκΈλ‘λ λ²μλμ΄ μμ΅λλ€.([1], [2])
λ€μμ wchar_tμ μ λμ½λλ₯Ό λ€λ£¨λ©΄μ μκ°νμ§λ λͺ»νλ λ¬Έμ λ‘ ν루λ₯Ό κΌ¬λ° λ³΄λ΄λ²λ¦¬κ² λ μ΄μΌκΈ°μ λλ€.
λ¬Έμ λ wcslen() λ©μλλ₯Ό ν΅ν΄ Lβ" λ‘ μ§μ λ λ¬Έμμ΄μ λ¬Έμμλ₯Ό μμμ€λλ°μμ μμνμ΅λλ€.
setlocale(LC_ALL, ".949"); wchar_t *wstr1 = L"abc"; printf("length: %d", wcslen(wstr1)); --- κ²°κ³Ό --- length: 3
μνλ κ²°κ³Όμμ΅λλ€. κ·Έλ°λ° λ€μ μ½λμ κ²°κ³Όλ μ΄μν©λλ€.
setlocale(LC_ALL, ".949"); wchar_t *wstr2 = L"κ°λλ€"; printf("length: %d", wcslen(wstr2)); --- κ²°κ³Ό --- length: 6
λΆλͺ ν νμ μ wchar_t μ΄λ―λ‘ κ²°κ³Όλ 3μ΄ λμμΌ ν κ² κ°μλ° char νμ κ³Ό strlen() ν¨μλ₯Ό μ¬μ©ν λμ λ§μ°¬κ°μ§λ‘ 6μ΄ λμ΅λλ€. κ·Έλμ λ©λͺ¨λ¦¬λ₯Ό λ€νν΄λ΄€μ΅λλ€. Lβabcβ μ κ²½μ° λ€μκ³Ό κ°μ΄ USC-16 little endian μΌλ‘ μ νν μ μ₯λμμ΅λλ€.
61 00 62 00 63 00 00 00
κ·Έλ°λ° λλ²μ§Έ Lβκ°λλ€β μ κ²½μ°
B0 00 A1 00 B3 00 AA 00 B4 00 D9 00 00 00
(μ λμ½λ νκΈ μ½λν
μ΄λΈκ³Ό KS-5601 μ½λν
μ΄λΈμ μ°Έκ³ νμΈμ)
βκ°λλ€βμ DBCS μΈμ½λ©μ λ¨μν 16λΉνΈλ‘ μ μ₯νκ³ μλ κ²μ΄μμ΅λλ€. μ°Έκ³ λ‘ βκ°λλ€βμ DBCS μΈμ½λ©μ λ€μκ³Ό κ°μ΅λλ€.
B0 A1 B3 AA B4 D9 00
νΉμ μ§κΈ μ κ° μ¬μ© μ€μΈ μλ¬Έ μλμ°μ λ¬Έμ κ° μλ κΉ μΆμ΄, vmwareλ₯Ό ν΅ν΄ νκΈ μλμ° 98 SEμ νκΈ μλμ° 2000μ μ¬μ©ν΄ ν μ€νΈν΄ λ΄λ κ°μ κ²°κ³Όκ° λμ€λκ΅°μ.
μ΄λ²μλ λͺ μμ μΌλ‘ MBCS λ¬Έμμ΄μ μ λμ½λ(USC-16 little endian)λ‘ λ³νν΄ wchar_tμ μ μ₯ν΄ λ³΄μμ΅λλ€.
setlocale(LC_ALL, ".949"); char *str2 = "κ°λλ€"; wchar_t wstr2_uni[blocksize]; memset(wstr2_uni, 0, blocksize * sizeof(wchar_t)); mbstowcs(wstr2_uni, str2, _mbstrlen(str2)); --- wstr2_uniμ λ©λͺ¨λ¦¬ λ€ν --- 00 AC 98 B0 E4 B2 00 00
μ΄λ κ²νλ μ²μμ μνλ λ° λ°λ‘ USC-16 little endian μΌλ‘ μ μ₯λλκ΅°μ.
κ²°λ‘ μ
- Lβ"μμλ λ¬Έμμ΄μ μ λμ½λλ‘ μΈμ½λ©νμ§ μλλ€. λ€λ§ λ¬Έμμ΄μ 16λΉνΈ wchar_tλ‘ μ μ₯ν λΏμ΄λ€. (μ΄λ κ² μ μ₯λμ΄λ μλ¬Έ Asciiλ μ λμ½λ μΈμ½λ©κ³Ό κ°μ κ²°κ³Όλ₯Ό μ»μ μ μμ΅λλ€.)
- μ λμ½λλ‘ μΈμ½λ©λ λ¬Έμμ΄μ μ»κΈ° μν΄μλ MBSCλ‘ λ λ¬Έμμ΄μ μ λμ½λλ‘ λ³νν΄ μ¬μ©ν΄μΌ λλ€.
그건 κ·Έλ λ€κ³ μΉκ³ , μμ¬μ΄ μ μ μ κ° λ³Έ μ λμ½λ κ΄λ ¨ λ¬Έμλ€μμλ Lβ" 리ν°λ΄μ μ΄μ κ°μ νΉμ±μ λν λ΄μ©μ μ°Ύμλ³Ό μ μμλ€λ κ²μ
λλ€.
μλ§λ μ μ μ λμ½λμ μ¬μ©μ΄ νμν μΈμ΄κΆμ μ¬λλ€μ΄ μ΄ κ²μ΄ μλ λλΆλΆ μλ¬Έ(νΉμ λΌν΄κ³μ΄ λ¬Έμ)μ μ¬μ©νλ μ¬λλ€μ΄ μμ±ν κΈμ΄κ±°λ μ΄ κΈμ λ²μν κΈμ΄κΈ° λλ¬ΈμΌ κ²μ΄λΌ μκ°ν΄ λ΄
λλ€.
ps) μμλ κ°μ μννΈμ¨μ΄μ μμ¬κ° νλ μ§λ§ μμ§λ globalizationμ λ¬μ±νκΈ° νλ λμ μμ€μ μꡬμ¬νμ΄ μλκΉ ν©λλ€.
update
νΉμλ νκ³ #pragmaλ₯Ό μ‘°μ¬ν΄λ³΄λ€ #pragma setlocale()λ₯Ό λ°κ²¬νμ΅λλ€. λ€μκ³Ό κ°μ΄ μ§μ ν΄μ€¬λλ Lβ" 리ν°λ΄ λ¬Έμ κ° λͺ¨λ ν΄κ²°λλ κ΅°μ.
#pragma setlocale(".949")
μ’ λ μμλ³΄κ³ ν¬μ€νΈν κ±Έ κ·Έλ¬μ΅λλ€.