You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 22:41:19