Unicode环境下如何实现多语言CString到String的正常转换?
解决CString跨语言转String的问题
问题原因
你当前用CP_ACP(系统默认ANSI编码页)做宽字节转多字节,这个编码和系统区域设置强绑定——比如中文系统用GBK、德语系统用ISO-8859-1,一旦路径包含非当前代码页的字符,就会出现乱码或字符丢失(比如德语变音符号被替换、中文变成问号)。
解决方案
改用UTF-8编码(CP_UTF8)做转换,UTF-8是通用多字节编码,支持所有Unicode字符,能完美兼容各种语言的路径。
修改后的代码示例
CString strfile = _T("C:\\Users\\A\\Desktop\\스캔\\LowerScanFile.ply"); //韩语 // CString strfile = _T("C:\\Users\\A\\Desktop\\ScanFile_11_12\\LowerScanFile.ply"); //英语 // CString strfile = _T("C:\\Users\\A\\Desktop\\歯科医療機器\\LowerScanFile.ply"); //中文 // CString strfile = _T("C:\\Users\\A\\Desktop\\München\\LowerScanFile.ply"); //德语 wchar_t* wchar_str = strfile.GetBuffer(strfile.GetLength()); int char_str_len = WideCharToMultiByte(CP_UTF8, 0, wchar_str, -1, NULL, 0, NULL, NULL); char* char_str = new char[char_str_len]; WideCharToMultiByte(CP_UTF8, 0, wchar_str, -1, char_str, char_str_len, NULL, NULL); // 注意:调用GetBuffer后必须释放,否则会破坏CString内部状态 strfile.ReleaseBuffer(); // 使用完char_str后记得释放内存,避免泄漏 // delete[] char_str;
关键修改点
- 把
WideCharToMultiByte的第一个参数从CP_ACP替换为CP_UTF8 - 调用
GetBuffer后必须调用ReleaseBuffer,维护CString的正确性 - 手动释放
new分配的char_str,防止内存泄漏
额外提示
如果后续逻辑要处理转换后的字符串,确保接收方也支持UTF-8编码(比如文件操作时指定UTF-8打开、传递给支持UTF-8的API)。
内容的提问来源于stack exchange,提问作者Jin Sil Kim
相关产品推荐
相关产品推荐

