본문 바로가기

프로그래밍/C-CPP

[Win32] CharLowerA(utf8str) 은 문제가 생길 수 있다.

반응형

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); } 


로 하면 깨지지 않음.

728x90