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);
}
당신이'p0'에 액세스? 'msg'가 범위를 벗어나면'p0'은 무효가됩니다. 파괴 된 객체에 매달려있는 포인터입니다. 'msg'가 파기 된 후에 문자열에 접근 할 필요가 있다면 문자열을 다른 것으로 복사해야합니다. – bames53
@ bames53 예, 괜찮습니다. 그러나 p0은이 함수 안에서만 사용됩니다 - msg가 범위에있는 동안 –