utf-8 인코딩된 한글 문자열에 대해서 CharLowerA 를 적용하면, 문자가 깨질 수 있다.
char utf8str[200];
WCHAR s1[200] = L"제공호";
WCHAR s2[200];
// s1 을 utf8 인코딩으로 변환하여 utf8str 을 채운다. (WideCharToMultiByte 등을 사용.)
CharLowerA(utf8str); // utf8str 중에서 알파벳만 모두 소문자로 바꾸려 한다.
// 변경된 utf8str 을 unicode 로 변환하여, s2 에 저장한다. (MultiByteToWideChar 등을 사용.)
cmp = wcscmp(CharLowerW(s1), s2);
위 코드에서 두가지 경로로 문자를 소문자화하여 비교한다.
1. s1 -> utf8로 인코딩 -> CharLowerA (소문자화) -> 다시 유니코드로 변경하여 s2에 저장.
2. s1 -> CharLowerW (소문자화)
s1 에 영문이 포함되지 않으므로, 두가지 결과 모두 L"제공호"로 동일해야 할 것 같지만, s2 는 일부가 깨지고, wcscmp 결과는 다르게 된다.
CharLowerA 에서 소문자화하기 전에, 아마도 실행윈도우즈의 로케일 언어 인코딩으로 utf-8 스트링을 변환하며, 오류가 발생하는 것 같다. (확실치는 않음.)
아무튼 주의가 필요하다.
CharLowerA(utf8str)
대신에
for( char*p = utf8str ; *p ; p++ ) { *p = tolower(*p); }
로 하면 깨지지 않음.
'프로그래밍 > C-CPP' 카테고리의 다른 글
[MFC초보] Simple3D (0) | 2021.02.08 |
---|---|
한글 visual studio 를 사용할 때, vcpkg install zlib 과정에 문자가 깨지며 빌드에러가 발생함. (0) | 2019.11.27 |
[VCPKG] VCPKG OFFLINE 사용하기 (0) | 2018.05.16 |
[번역|스택오버플로우] 타입명 뒤에 괄호를 붙이는지 안 붙이는지에 차이가 있나? (0) | 2017.09.13 |
[CEF] CEF Chromium Embedded Framework 빌드하기 (0) | 2017.04.10 |