QT的中文显示乱码问题解决

2023-05-16

QT的中文显示乱码问题解决

  • QT的中文显示乱码问题解决:
    • 1、查看源文件的编码格式,有必要的话转换源文件的编码格式再重新编译运行尝试汉字能否正常显示。
    • 2、在代码里面解决:
    • 3、用法:

QT的中文显示乱码问题解决:

1、查看源文件的编码格式,有必要的话转换源文件的编码格式再重新编译运行尝试汉字能否正常显示。

1、编码格式不对:明明加了头文件跟写了声明,但是VS还会报错:
			写代码没有代码提示。
			常量中有换行符。
			未定义的标识符。
			还有一些其他的莫名其妙的问题。
			
2、转换报错源文件编码格式:

	1、比如VS新建的源文件或者你当前报错的源文件的编码格式是这里面其中之一:”UTF-8“、”UTF-8-BOM“、"ANSI"、”UCS-2 Big Endian“、"UCS-2 Little Endian""UTF-16 LE""UTF-16 BE"2、用Windows记事本或者Notpad++或者Linux的gedit打开报错的源文件,查看报错源文件当前编码格式,比如,报错源文件的编码格式是”UTF-8“。
	
	3、然后再用Windows记事本或者Notpad++或者Linux的gedit打开项目中正常没有报错的源文件,比如,项目中正常的源文件编码格式是”UTF-8-BOM“。
	
	4、用Notpad++打开报错源文件,在工具栏的“编码”一栏可以选择“转为“UTF-8-BOM”编码”,然后记得保存修改。重新编译链接生成问题应该就解决了。
		
		或者:
		用Windows的记事本打开源文件,在菜单栏文件里面选择“另存为”,然后在打开的窗口里可以选择编码为“UTF-8-BOM”,然后记得保存修改。重新编译链接生成问题应该就解决了。

2、在代码里面解决:

2、qDebug() << QStringLiteral("录屏完成"));			推荐
	
3、qDebug() << QObject::tr("1中文"));				推荐国际化软件使用,其余不推荐

4、qDebug() << QString::fromLocal8Bit("4中文");		不推荐,

5、qDebug() << QString::fromLatin1("3中文");			不推荐

6、qDebug() << QString::fromUtf8("5中文");			推荐

7、qDebug() << QString::fromWCharArray(L"6中文");	不推荐,字符串的编码取决于 wchar 的大小。

8、qDebug() << QStringLiteral("hello word %1");		不推荐,

9、qDebug() << (u8"显示轨迹关键点");			//在中文字符前加上 u8,然后把中文字符用双引号包括			推荐

10、在头文件的类前面放入这一行,设置源文件的编码格式:	
# pragma execution_character_set("utf-8")

3、用法:

当QTextCodec::codecForName("utf-8");时,QString::fromLocal8Bit和QString::fromUtf8是等效的。

当QTextCodec::codecForName("gbk");时,QString::fromLocal8Bit和QString::fromUtf8是不等效的。


1、QStringLiteral("录屏完成")		推荐
	使用QStringLiteral宏可以在编译期把代码里的常量字符串“str”直接构造为QString对象,于是运行时就不再需要额外的构造开销了。

	如果编译器支持,则 QStringLiteral 宏在编译时从 str 生成一个 QString 的数据。在这种情况下从 QStringLiteral 创建一个 QString 是自由的,生成的字符串数据存储在编译的目标文件的只读段中。

	对于不支持创建编译时字符串的编译器,QStringLiteral 的使用效果将与使用 QString::fromUtf8() 一样。


2、QObject::tr("1中文")				推荐国际化软件使用,其余不推荐
	 
	tr()是QT的基类QObject 的方法,所有QObject的子类都可以继承该方法。
	tr()全名是QObject::tr(),被它处理的 字符串可以 使用工具提 取出来翻译 成其他语言, 也就是做国际化使用。
	
	Qt 的最佳实践:如果你想要你做的程序国际化,那么,就把所有用户可见的字符串都要使用 QObject::tr()!可直接用工具翻译成多语言的版本。

	tr 是做什么的?下面二者的区别是什么?

		QString text1 = QObject::tr("hello");
		QString text2 = QString("hello");

	tr是用来实现国际化,如果你为这个程序提供了中文翻译包(其中hello被翻译成中文"你好"),那么text1的内容将是中文"你好";
		如果你为程序提供且使用日文翻译包,那么text1的内容将是“こんにちは”。

	tr是经过多级函数调用才实现了翻译操作,是有代价的,所以不该用的时候最好不要用。

	总结
		如果没有国际化需求的情况下是没必要去使用tr的,直接使用QString省去了多级函数的调用,提高效率它不香吗(●’◡’●)3、QString::fromLocal8Bit("4中文")		(不推荐)

	qt fromLocal8Bit()函数可以设置编码。

	QT默认的编码是unicode,不能显示中文的。
	
	windows默认使用(GBK/GB2312/GB18030)

	使用fromLocal8Bit()函数,实现了从本地字符集GB到Unicode的转换,用于处理汉语显示乱码等问题。

	static inline QString fromLocal8Bit(const QByteArray &str);该函数返回的是String类型的数
	
	不推荐,	不是每次都能凑效的。因为这个Local是可以动态变化的。再啰嗦一次,如果是中文操作系统,这个local就是gbk,恰好不换操作系统环境,恰好写中文恰好可以显示。但是如果换个操作系统,比如用户运行环境是英文操作系统;或者编程中动态使用上面的SetCodecForLocale修改了编码,则下面的FromLocal8Bit处理中文就又稀里糊涂的会出现乱码。


4、QString::fromLatin1("3中文")				不推荐
	
	将 Latin-1 字符 c 转换为其等效的 QChar。 这主要对非国际化软件有用。
	
	
5、QString::fromUtf8("5中文")				推荐,保证源输入文件是utf8编码的,编程处理也简化直接按照utf8来读取。
	
	返回使用 UTF-8 字符串 str 的第一个 size 字节初始化的 QString。
	如果 size 为 -1(默认值),则采用 strlen(str)。

	UTF-8 是一种 Unicode 编解码器,可以表示 Unicode 字符串(如 QString)中的所有字符。但是,UTF-8 可能会出现无效序列,如果发现任何此类,它们将被替换为一个或多个“替换字符”,或被禁止。这些包括非 Unicode 序列、非字符、超长序列或编码为 UTF-8 的代理代码点。

	只要所有UTF-8字符在传入数据中终止,此函数就可用于增量处理传入数据。字符串末尾的任何未终止字符都将被替换或抑制。为了进行有状态解码,请使用 QTextDecoder。

	返回使用 UTF-8 字符串 str 初始化的 QString。
	
	当然str中的中文需要使用u8来标识前缀的,或者本身就是读取文件中的utf8格式的字符串。
	这样保证源输入文件是utf8编码的,编程处理也简化直接按照utf8来读取。

6、QString::fromWCharArray(L"6中文")、			不推荐

	返回字符串的副本,其中字符串的编码取决于 wchar 的大小。 
	
	如果 wchar 为 4 字节,则字符串被解释为 UCS-4,
	
	如果 wchar 为 2 字节,则字符串被解释为 UTF-16。

	如果 size 为 -1(默认),则字符串必须以 0 结尾。


7(u8"显示轨迹关键点");	//在中文字符前加上 u8,然后把中文字符用双引号包括		推荐·
	
	凡是有中文的字符串,前面加前缀u8。这样就是显示告诉编译器,在生成exe文件字节码的时候,把中文编码为utf8格式,不要使用gbk或者其它编码。

	所以为了避免一些鬼畜的问题。我们如果保证文件保存一律使用utf8-bom编码格式保存,再保证条件编码中有中文则加前缀u8。就解决了所有这些鬼畜问题。代码中编程读取文件解析的时候,同样全部使用utf8格式来解析。这样就万无一失了。

	(3)QT中出现中文乱码的情况

		注意QT的本地编码,是可以在程序中动态变化的。

		QTextCodec *QTextCodec::codecForLocale() 
		这个函数可以获取当前QT运行环境中,使用的本地编码。不出意外的话,如果是中文操作系统,没有修改本地编码的情况下,这个返回就是GBK。

		void QTextCodec::setCodecForLocale(QTextCodec *c),可以编程动态去修改QT运行环境中的本地编码。

		许多QT使用者喜欢不分青红皂白直接调用QString QString::fromLocal8Bit来处理中文,这样不是每次都能凑效的。因为这个Local是可以动态变化的。再啰嗦一次,如果是中文操作系统,这个local就是gbk,恰好不换操作系统环境,恰好写中文恰好可以显示。
		但是如果换个操作系统,比如用户运行环境是英文操作系统;或者编程中动态使用上面的SetCodecForLocale修改了编码,则下面的FromLocal8Bit处理中文就又稀里糊涂的会出现乱码。

		我们压根就不应该随意使用QString QString::fromLocal8Bit,不要依赖本地编码,本地编码在不同系统上而不同。
		如果我们保证了前面说的条件(1)和条件(2):
		
			我们完全可以只使用如下这个接口:QString fromUtf8(const char *str, int size = -1) 。
			当然str中的中文需要使用u8来标识前缀的,或者本身就是读取文件中的utf8格式的字符串。代码中只按照utf8格式去解析处理字符串就行。即保证输入文件是utf8格式,编程也按照utf8来解析,则一切复杂问题都可以简化,甚至没有问题了。
			
		直接使用前面的QString fromUtf8(const char *str, int size = -1)。
		这样保证源输入文件是utf8编码的,编程处理也简化直接按照utf8来读取。
		大家都简单省事,省去了鬼畜的动态识别编码。
		动态识别本地编码,然后识别后匹配去解析文件,
		一句话,吃力不讨好,还可能出错。

	(4)u8能不能支持,是取决于编译器版本。
		在C++11之前,通常是使用L""来指定宽字符串,但是并没有要求编译器规定宽字符串的存储,对此windows使用的是2个字节,即UCS-2(早期),UTF-16(最新)。

		C++11引入了u8"utf-8字符串",u"utf-16字符串",U"utf-32字符串"。以及R"(非转义字符串)"可直接写不用转义的字符串,和对应的utf版本u8R"(utf-8非转义字符串)",uR"(utf-16非转义字符串)",UR"(utf-32字符串)"。

	简而言之,只要你编译器支持C++11,就是可以支持的了。目前大部分主流编译器都是支持的。


8、QStringLiteral("hello word %1")		不推荐·,参数需要QStirng参数类型的地方,再用。

	函数只能接受QString类型的参数时,无论我们给一个字面字符串或QLatin1String,都会隐式构造一个临时的QString对象,构造这个对象需要在栈上申请一定的内存空间,然后把字符串拷贝过去,如果这样的调用比较多,那还是一笔不小的开销。
	
	此时,我们可以使用QStringLiteral来减小这个开销。

	QStringLiteral其实是一个宏,从字符串常量创建QString对象的宏。

	宏在编译时,从字符串文字生成QString数据,QString的内部数据将在编译时生成,在运行时不会发生任何转换或内存分配,使用QStringLiteral来代替C++中的双重数值传递将会在编译的时候显著的提升运行效率。

**优点:**
	使用QStringLiteral而不是双引号的普通C++的字符串可显著加快从编译时已知的数据创建QString示例的速度,相对来说有QLatin1String参数重载的比使用QStringLieral更高效。

总结:

	参数能使用const char*类型或QLatin1String类型的地方使用相应的参数。
	参数需要QStirng参数类型的地方,若值不被修改,则使用QStirngLiteral宏。
	参数需要QString类型且QStirng可能被修改,则直接使用QString或隐式转换。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT的中文显示乱码问题解决 的相关文章

  • 网络 UDP协议(C++|代码通过udp协议实现客户端与服务端之间的通信)

    这里写目录标题 udp通信编程各端的操作流程 xff1a 服务端操作流程 xff1a 客户端操作流程 xff1a 第2 3步与服务端不同 socket接口介绍udp客户服务端代码实现 推荐阅读 socket套接字编程就是在网络程序中编写代码
  • 网络 TCP协议(C++代码|通过tcp协议实现客户端与服务端之间的通信)

    目录 TCP通信编程各端的操作流程 xff1a 服务端操作流程 xff1a 客户端操作流程 xff1a 推荐先学习UDP协议在学习TCP协议 在UDP协议博客中讲解得更详细 xff0c 看懂UDP协议就很容易理解TCP了 网络 UDP协议
  • Matlab学习-箱型图绘制

    1 箱型图简介 xff1a 参考链接 xff1a boxplot函数用法详解 箱型图简介 箱型图主要包括的数据有 xff1a 最大值 最小值 上四分位数 下四分位数和中位数 xff0c 以及异常值 2 箱型图绘制 X span class
  • Matlab学习-CDF(累积分布函数图)绘制

    累积分布函数图绘制 参考链接 xff1a 1 Matlab官方说明 2 参考链接 3 属性设置 CDF xff1a 累积分布函数图 xff0c 顾名思义就是能够直观的反应某组数列分布的概率情况 xff0c 能够非常直观的反应误差精度大小 图
  • Matlab学习-频率分布直方图绘制

    参考链接 xff1a hist xff08 xff09 函数用法 频率分布直方图 xff1a 在数理统计中 xff0c 会经常使用到频率分布直方图 xff0c 能够直观的反应频率分布的范围大小 xff0c 在直角坐标系中 xff0c 横轴为
  • Matlab学习-经纬度在matlab内置地图显示

    已知经纬度坐标 xff0c 将其显示是地图上 参考链接 xff1a 使用matlab绘制世界地图并根据经纬度绘制点位 附m map的下载与安装说明 wm span class token operator 61 span webmap sp
  • ARM存储格式的“大小端”解析

    ARM储存 大端格式和小端格式 所谓的大端模式 xff0c 是指数据的高位 xff0c 保存在内存的低地址中 xff0c 而数据的低位 xff0c 保存在内存的高地址中 xff0c 这样的存储模式有点儿类似于把数据当作字符串顺序处理 xff
  • UBLOX板卡基础设置--F9P板卡配置(基准站和流动站)

    UBLOX F9P板卡配置 基准站 流动站 UBX F9P模块为双频定位芯片 xff0c 是市场上目前最常用的高精定位模块 xff0c 差分定位精度可达厘米级 xff0c 具体参数详见官方文档 官方文档下载链接 xff1a UBX F9P模
  • GIT学习-常用命令

    2 GIT学习 常用命令 在学习git前首先需要对相关名词和概念有基本了解 xff0c git基础知识学习可参考以下资料 xff1a git基础知识 xff1a GIT学习 1 基础知识git下载与配置 xff1a GIT学习 xff08
  • ROS常用命令

    ROS常用命令 1 将话题数据单独导出 将话题数据单独导出为一个文件 rostopic echo b name name p topic name gt save file name ex rostopic echo b test bag
  • Linux常用命令

    Linux常用命令 1 查看电脑IP地址 ifconfig 2 远程连接其他电脑 xff0c 查看是否连接成功 ping IP address 3 通过IP地址远程连接电脑 ssh lcl 64 IP address 4 文件传输 4 1
  • opencv-3.4.1-x86编译安装 -- 超详细

    相关链接 xff1a opencv 3 4 1 arm编译安装 超详细 opencv 3 4 1 x86编译安装 环境1 安装依赖库2 OpenCV源码获取与解压2 1 获取源码2 2 工作目录准备2 3 解压 3 OpenCV配置编译3
  • Qt编程之单例模式——代码复用,一个类供多个类调用

    什么是单例模式 单例模式是一种对象创建模式 xff0c 用于生产一个对象的实例 xff0c 它可以确保系统中一个类只产生一个实例 xff0c 这样做有两个好处 xff1a 1 对于频繁使用的对象 xff0c 可以省略创建对象所花费的时间 x
  • STM32串口数据接收处理,数据分割为整形浮点型数据。

    简介 通过stm32的串口接收数据 xff0c 通过strstr函数分割数据 xff0c 再将字符数据转化为整形数据或浮点数据 比如 xff1a stm32接收到数据 s555s xff0c 分割数据为 555 xff0c 然后转化为int
  • 抛出异常时将异常信息返给前端

    全局异常处理器负责将抛出的异常 xff0c 以统一的格式返给前端 在这里起主要作用的注解是 64 RestControllerAdvice 64 RestControllerAdvice主要配合 64 ExceptionHandler使用
  • 关于入栈和出栈的理解

    关于入栈和出栈的理解 xff1a 假设程序在运行 xff0c 这个时候就会涉及到下面要说到的几个核心的寄存器 xff08 对栈进行操作 xff09 就是PC寄存器 xff08 为了能够准确地记录各个线程正在执行的当前字节码指令地址 xff0
  • 原生 css 实现进度条

    方案一 xff1a 通过data控制它的样式 1 首先搭建dom结构 lt div class 61 34 home left top content div 34 v for 61 34 item index in PowerAAcces
  • 实现开发板、电脑(无线网卡)与虚拟机三者通过网络连接(三者都可以上外网)

    借鉴文章 xff1a https blog csdn net dongtaintailiang article details 106314689 spm 61 1001 2014 3001 5501 因为项目需要 xff0c 找到这篇文章
  • STM32串口发送接收数据

    目录 1 串口通信2 串口的结构体3 如何配置串口的发送4 通过串口向电脑发送ok字符5 封装发送字符串函数6 重定向printf串口发送7 串口输入控制LED灯开关遇到的问题 1 串口通信 我用的32是stm32f10x最小系统没有UAR

随机推荐