c++ TCHAR转string导致中文缺失或乱码问题及解决
c++ TCHAR转string导致中文缺失或乱码
1.确定编码方式
首先,确定TCHAR字符串的编码方式。
TCHAR可以表示宽字符,在Unicode编码环境中,TCHAR被定义为wchar_t类型;在ANSI编码环境下,TCHAR被定义为char类型
2.使用适当的函数进行转换
如果TCHAR字符集是ANSI(窄字符)编码
可以使用wcstombs或者使用CString的简化方法GetBuffer将TCHAR转换成char数组,并将该数组存储在string中:
std::string ConvertTCHARToString(const TCHAR* tcharString) { char charString[256]; wcstombs(charString, tcharString, sizeof(charString)); return std::string(charString); }
如果TCHAR字符集是Unicode(宽字符)编码
可以使用WideCharToMultiByte函数将宽字符转换成窄字符
std::string ConvertTCHARToString(const TCHAR* tcharString) { int bufferSize = WideCharToMultiByte(CP_UTF8, 0, tcharString, -1, nullptr, 0, nullptr, nullptr); std::string result(bufferSize, '\0'); WideCharToMultiByte(CP_UTF8, 0, tcharString, -1, &result[0], bufferSize, nullptr, nullptr); return result; }
如果上述转换方式出现乱码,可能是TCHAR字符串的保存方式非UTF-8,可以修改CP_UTF8,用对应的代码页值进行转换,
例如,使用CP_ACP可以表示使用当前系统的默认代码页:
std::string ConvertTCHARToString(const TCHAR* tcharString) { int bufferSize = WideCharToMultiByte(CP_ACP, 0, tcharString, -1, nullptr, 0, nullptr, nullptr); std::string result(bufferSize, '\0'); WideCharToMultiByte(CP_ACP, 0, tcharString, -1, &result[0], bufferSize, nullptr, nullptr); return result; }
UE4 C++ FString乱码显示问号
如果以"xxx"这种形式并且xxx为中文时,直接赋值给FString的变量会丢失数据导致系统无法识别,因此需要做特殊处理。
第一种解决
引号前加L表示将字符串转为unicode的字符串,也就是每个字符占用两个字节。
FString str = L"小明";
第二种解决
UTF8_TO_TCHAR,也就是将字符串以UTF8格式保存转为TCHAR,TCHAR再隐式转换为FString。
FString str = UTF8_TO_TCHAR("小红");
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
最新评论