2012-02-13 4 views
1

멀티 바이트 문자 집합으로 컴파일 된 프로젝트가 있습니다. msg1에 일본어 문자가 포함되어 있으면 아래의 변환이 실패합니다.일본어 시스템에서 올바르지 않은 문자 변환

bool MyClass::UnfoldEnvelope(BSTR msg1) 
{ 
    CW2A msg(msg1); 
    LPCTSTR p0 = msg; 
    .... 
} 

입력시 msg1은 유니 코드 문자를 포함하고 경로 이름이 일본어 인 BSTR입니다. CW2A 변환은 호출 후에 msg가 인식 할 수있는 문자열을 일본어로 포함한다는 점에서 효과가있는 것으로 보입니다. 그러나 LPCTSTR 지정이 실패합니다. 줄 뒤에는 p0에 쓰레기가 있습니다. p0 문자열은 이전 코드에서 계속 사용되어 터치하기를 꺼립니다.

이 경우 "msg"문자열에 대한 포인터를 얻는 올바른 방법은 무엇입니까?

영어로 모든 것이 정상적으로 작동합니다.

+0

당신이'p0'에 액세스? 'msg'가 범위를 벗어나면'p0'은 무효가됩니다. 파괴 된 객체에 매달려있는 포인터입니다. 'msg'가 파기 된 후에 문자열에 접근 할 필요가 있다면 문자열을 다른 것으로 복사해야합니다. – bames53

+0

@ bames53 예, 괜찮습니다. 그러나 p0은이 함수 안에서만 사용됩니다 - msg가 범위에있는 동안 –

답변

0

WideCharToMultiByte을 사용해보세요! CP_ACP는 와이드 문자 문자열을 현재 Windows 언어의 단일 바이트 문자열로 전송합니다 (일본어 Windows에서 일본어 일 수 있음, CW2A도 마찬가지 임). Windows가 일본어는 아니지만 일본어 문자가있는 경우 CP_UTF8 (UTF-8)을 사용하고 텍스트를 사용 (표시, 인쇄 또는 파일 이름으로 사용) 할 때 UTF-16 (wchar_t)으로 다시 전송해야합니다. 다시 변환하려면 MultiByteToWideChar 함수를 사용해야합니다.

ANSI 멀티 바이트 코드는 유니 코드 전체의 일부일뿐입니다. Windows는 Windows 위치와 동일한 하위 집합을 사용합니다 (Control Panel에서 구성 할 수 있음). 실제 유니 코드 문자열이 있거나 로케일 기반 문자열이 없으면 모든 문자를 유니 코드로 유지해야합니다. 단일 바이트 문자열 및 유니 코드로 작업하려면 wchar_t 문자열 (모든 Windows 와이드 문자는 UTF-16 임)을 UTF-8 유니 코드 문자열로 전송해야합니다.

확인이 소스 :`msg`이 범위에있는 동안

bool MyClass::UnfoldEnvelope(BSTR msg1) 
{ 
    // Get the necessary space for single byte string 
    int new_size = WideCharToMultiByte(CP_UTF8, 0, msg1, -1, NULL, NULL, NULL, NULL); 
    if (new_size <= 0) 
     return false; 
    // Use vector to C functions 
    vector<char> p0(new_size); 
    // Convert the string 
    if (WideCharToMultiByte(CP_UTF8, 0, msg1, -1, &p0[0], new_size, NULL, NULL) <= 0) 
    { 
     return false; 
    } 
    // use string as a usual single byte string (save, load etc.) 
    .... 
    // get the string size in UTF-16 
    new_size = MultiByteToWideChar(CP_UTF8, 0, &p0[0], -1, NULL, NULL); 
    if (new_size <= 0) 
     return false; 
    // Use vector to C functions 
    vector<wchar_t> p1w(new_size); 
    // convert back to UTF-16 
    if (MultiByteToWideChar(CP_UTF8, 0, &p0[0], -1, &p1w[0], new_size) <= 0) 
     return false; 
    ... 
    // use your Unicode string as a file name 
    return (CopyFileW(L"old_file", &p1w[0], TRUE) != FALSE); 
} 
+0

가장 도움이되는 설명 주셔서 감사합니다 - Andrew –

+0

@AndrewS .: 단지 한 가지 더 : 필요하지 않은 경우 와이드 문자열을 멀티 바이트 문자열로 변환해서는 안됩니다. Windows API의 다양한 기능을 사용하면 넓은 문자열을 간단하게 사용할 수 있습니다. :) – Naszta