使用UTF8ToUnicodeString将std::wstring转UnicodeString出现乱码问题
问题原因与解决方案
核心触发原因
你遇到的字符被替换为U+FFFD的问题90%以上是函数输入类型不匹配导致的:
UTF8ToUnicodeString()函数的输入参数要求为 UTF-8编码的单字节字符序列(对应char*/UTF8String类型),你直接传入std::wstring类型的宽字符序列时,编译器会执行隐式类型转换,将宽字节的wchar_t数组按单字节char规则读取,编码直接被破坏。- 仅ASCII范围内的字符(值小于0x80)在这种错误转换下能刚好匹配,俄文、越南文等超出ASCII范围的字符编码会被截断/错位,最终被替换为U+FFFD占位符。
代码页相关的可能性
如果你的实际操作是先把std::wstring转为char数组再传入函数,那么问题确实和代码页设置有关:
如果你在宽字符转单字节
char数组时,使用了系统默认的ANSI代码页(比如中文环境为CP936),俄文、越南文的字符不在当前ANSI代码页的支持范围内,转换阶段就会被替换为?,后续传入UTF8ToUnicodeString()时就会转为U+FFFD。
正确转换方案
std::wstring 转 UnicodeString 不需要绕UTF-8转换函数,直接调用构造函数即可:
std::wstring wstr = L"你的俄文/越南文字符串"; // 直接传入wchar_t指针和长度,UnicodeString原生兼容Windows平台UTF-16编码的std::wstring UnicodeString ustr(wstr.c_str(), wstr.length());
如果你必须走UTF-8中转流程,需要先明确指定CP_UTF8代码页完成宽字符到UTF-8的转换,再传入UTF8ToUnicodeString():
// 第一步:std::wstring转UTF-8编码的char数组 int len = WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), wstr.length(), NULL, 0, NULL, NULL); std::string utf8_str(len, 0); WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), wstr.length(), &utf8_str[0], len, NULL, NULL); // 第二步:转UnicodeString UnicodeString ustr = UTF8ToUnicodeString(utf8_str.c_str());
内容的提问来源于stack exchange,提问作者geldo
相关产品推荐
相关产品推荐

