[UE4图文系列] 5.字符串转中文乱码问题说明
原文连接:[UE4图文系列] 5.字符串转中文乱码问题说明 - 哔哩哔哩
本例以原生C++和UE4 C++字符串传输中出现的中文乱码问题进行说明
一.乱码示例:
1.直接用中文字符串初始化FString,在蓝图中进行打印
FString GetStrWithChinese()
{
FString fstr="这是一句中文";
return fstr;
}
中文乱码
结果很明显是不符合预期
正确用法:使用TEXT()宏包裹住中文字符
FString GetStrWithChinese()
{
FString fstr=TEXT("这是一句中文");
return fstr;
}
使用TEXT宏之后,中文正常显示
2.std::string转FString导致的乱码
std::string cstr = "中文技术哪家强";
FString fstr=FString(cstr.cstr());
说明:
(1).可以看到这里是乱码的,这是因为std::string可以理解为char数组,char占1个字节,而中文字符根据不同平台,一般占用2个字符,超出了存储范围,因此导致乱码.
(2).纯C++中可以使用std::wstring(宽字符)来存储中文,std::wstring.cstr()会返回一个const wchar_t*类型,UE4中常用的TCHAR实际上就是wchar_t的别名.
(3).可以认为 std::wstring.cstr()==const wchar_t*==const TCHAR*
正确做法1:
//宽字符初始化要L开头
std::wstring cwstr = L"中文技术哪家强?";
//还可以使用wchar_t*来表示一个包含中文的字符串
wchar_t* wchar = L"中文技术哪家强?";
//wchar_t*和std::wstirng的转换
const wchar_t* tmpwchar = cwstr.c_str();
//上面说了TCHAR本质就是wchar_t
TCHAR* tchar = wchar;
//std::wstring.cstr()返回的是const wchar_t*,所以这里使用const_cast将其由const wchar_t*转换成wchar_t*,也就是TCHAR*
TCHAR* tchar = const_cast<wchar_t*>(cwstr.c_str());
//ue4中,可以直接使用TCHAR*或者const TCHAR*来初始化FString
FString fstr=tchar;
调试可以看到存储中文字符串的std::wstring转换成FString并没有乱码
正确做法2:
//如果其他平台传来的是带有中文的std::string字符串
std::string cstr="中文技术哪家强?";
//windows平台std::string使用utf-8编码格式,可以使用ue提供的UTF8_TO_TCHAR宏将std::string转换成ue支持的TCHAR
FString fstr=FString(UTF8_TO_TCHAR(cstr.cstr());
存储中文字符的std::string,使用UTF8_TO_TCHAR宏转换成FString之后,也没有中文乱码
上面两种方法都可以,具体用哪种,取决于所对接平台给你发送的字符串类型.
3.FString转std::string乱码
//定义一个包含中文的FString
FString fstr = TEXT("这是一句中文" );
//使用TCHAR_TO_UTF8将FString转换成std::string
std::string cstr = TCHAR_TO_UTF8(*fstr);
将存储中文字符的FString通过TCHAR_TO_UTF8反向转换成std::string后看上去是乱码,看上去出错了,但是实际上真的是这样吗?
上图中转换出来的cstr是乱码,但是这并不能认为是错误,因为之前已经说过了,std::string是无法存储中文字符的,可以理解为,std::string中存储的数据并没有被损坏,只是他不能正常的显示中文而已.我们可以把它转换成std::wstirng看看是否正常.
我们创建一个函数用来将std::string转换成std::wstring:
MultiByteToWideChar和WideCharToMultiByte需要导入Windows.h
#include<Windows.h>
原文地址:https://blog.csdn.net/u010087338/article/details/145169594
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!