[UE4图文系列] 5.字符串转中文乱码问题说明

embedded/2025/1/19 10:42:27/

 

原文连接:[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&lt;Windows.h&gt;


http://www.ppmy.cn/embedded/155195.html

相关文章

安卓端使用线程下载文件卡滞

需求&#xff1a;从阿里云oss下载大量的图片&#xff08;4000&#xff09;到手机的内部存储 /// <summary>/// 指定要下载的文件列表/// </summary>/// <param name"aliyunFile">阿里云上要下载文件所在文件夹</param>/// <param name&qu…

财务RPA就是财务机器人吗?有什么作用

近年来&#xff0c;财务RPA&#xff08;机器人流程自动化&#xff09;逐渐成为财务领域的热门话题。很多人初次听到“财务RPA”时&#xff0c;可能会疑惑&#xff1a;财务RPA是不是财务机器人&#xff1f;它到底能做什么&#xff1f;带着这些问题&#xff0c;我们一起来探讨财务…

职场沟通与行为

职场沟通与行为 引言 在职场上&#xff0c;你是否曾遇到过困惑的沟通&#xff1f;是否对同事的行为有过疑虑&#xff1f;这不仅是个别现象&#xff0c;而是我们这个时代工作文化中的普遍问题。许多职场的摩擦&#xff0c;来自沟通不畅或是行为不当。那么&#xff0c;如何才能…

使用 ChatGPT 生成和改进你的论文

文章目录 零、前言一、操作引导二、 生成段落或文章片段三、重写段落四、扩展内容五、生成大纲内容六、提高清晰度和精准度七、解决特定的写作挑战八、感受 零、前言 我是虚竹哥&#xff0c;目标是带十万人玩转ChatGPT。 ChatGPT 是一个非常有用的工具&#xff0c;可以帮助你…

随机森林分类算法原理与实验分析

随机森林分类算法原理与实验分析 1. 引言 随机森林(Random Forest)是一种集成学习方法,它通过构建多个决策树并结合它们的预测结果来进行分类。你可以把它想象成一个“团队决策”的过程:团队中的每个成员(决策树)都独立发表意见,最后通过投票决定最终结果。这种方法不…

【springboot】Spring 官方抛弃了 Java 8!新idea如何创建java8项目

解决idea至少创建jdk17项目 问题 idea现在只能创建最少jdk17&#xff0c;不能创建java8了吗?解决 问题 idea现在只能创建最少jdk17&#xff0c;不能创建java8了吗 我本来以为是 IDEA 版本更新导致的 Bug&#xff0c;开始还没在意。 直到我今天自己初始化项目时才发现&am…

HunyuanVideo 文生视频模型实践

HunyuanVideo 文生视频模型实践 flyfish 运行 HunyuanVideo 模型使用文本生成视频的推荐配置&#xff08;batch size 1&#xff09;&#xff1a; 模型分辨率(height/width/frame)峰值显存HunyuanVideo720px1280px129f60GHunyuanVideo544px960px129f45G 本项目适用于使用 N…

使用jupyter notebook没有正常打开浏览器的几种情况解决

迅速记录前期 1.下载 https://www.anaconda.com/products/individual 2.安装 直接默认安装就行 3.打开jupyter notebook 在开始菜单里面可以找到 4.遇到的问题解决 1.运行jupyter notebook&#xff0c;黑窗口自动关了 每次黑窗口迅速的加载完就自己关掉了 也没有打开新…