Qt5 乱码解决方法

时间:2021-10-05 23:12:41
小弟刚用QT不久,最近做个项目用的是Qt5 + VS2010 + Qt Creator + WinDbg
编译出来老出现中文乱码,在网上搜索没有找到解决方法,现在不只是静态字符串造成这样的情况还有一个问题就是,我选择文件路径(包含中文)显示在label控件中,然后通过text()函数获取保存在QString中但是调用QString的成员函数toStdString转为STL的string时出现乱码。
网上方法大概就是:
1.用tr然后翻译,但是不能解决我上面说的那个问题。
2.保存为utf8不带BOM格式的文件,我试过了,还是不行,是不是我采用的vs2010编译器的原因。难道只能采用mingw
3.QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF8"));这个方法也无效
特别郁闷的时Qt那么多人用,竟然没有完美的乱码解决方法, 如果是MFC早就有一大堆解决方案了。请求各位大侠支招。

25 个解决方案

#2


这个讲的是Qt4的现在Qt5取消了那几个函数

#3


保存为utf8带bom的

#4



引用 3 楼 cai6811376 的回复:
保存为utf8带bom的

谢谢回复,我试过了也不行
网上说还要加上
#pragma execution_character_set("utf-8")
但是编译过程中说这个pragma无效,网上说的时VS2010支持这个指令。不知道怎么回事

#5


自己顶一下,希望大家能发表一下看法啊

#6


其实还是你的中文编码保持一致的问题,这里的一致包含很多地方:你的运行环境编码,你的源代码文本编码(这个尤其要当心),Qt5里边确实没有了4.8的那些你很熟悉的编码类及功能,但是同样Qt5有他的一套方式。最简便的办法是在需要统一编码的是后都toUnicode活着fromUnicode

#7


这确实是一种办法,只是程序中对所有的字符串使用这两个函数太麻烦了,而且效率也不清楚有多高

#8


可以不在源码里面写非英文吗?

#9


我现在是通过FileDialog选择的文件路径,路径中包含英文的QString显示是正常的,但是toStdString就乱码了

#10


我现在是通过FileDialog选择的文件路径,路径中包含 文的QString显示是正常的,但是toStdString就乱码了

#11


保存为utf8带bom,然后字符串用QStringLiteral();如QStringLiteral("中文字符串")

#12


有的时候我用UTF8还是乱码,用GBK就好了

#13


用 utf8编码、mingw 编译 好像没问题的

#14


引用 8 楼 ppdayz 的回复:
可以不在源码里面写非英文吗?

+1
这个是解决这个问题的标准办法。

#15


我的问题不是在源码里面写了中文,而是我通过QFileDialog读回来的文件路径里面包含中文比如桌面之类的汉字,我用toStdString就是乱码了,如果直接转换成toStdWString型的就可以正常显示

#16


QStringLiteral这个宏全部把字符串扩起来,就像QStringLiteral("中文"),还有就是生成的文件有记事本打开,点另存utf-8,覆盖,就是原本是utf-8但不带bom,只要用记事本另存utf-8再加上QStringLiteral就不会有问题了

#17


Qt5 乱码解决方法

#18


QT 知识.学习了!

#19


发了两个这个问题的帖子但是还是未解决,我就是从文件对话框中读取文件路径,然后toStdString转成string成乱码了,就是找不到解决办法,如果toStdWString 不会是乱码,但是我类接口就是string类型的

#20


如果使用vs2010编译器的话,把源码保存为带BOM的utf8格式,然后在文件头加上#pragma execution_character_set("utf-8")即可,如果出现“未知的杂注”是因为vs2010不认识该语句,打上vs2010 sp1补丁即可。希望对你有帮助!

#21


action_2->setText(QApplication::translate("MainWindow", "\346\226\207\344\273\266", 0, QApplication::UnicodeUTF8));

只是一个用到汉字时系统一种用法:\346\226\207\344\273\266 是UTF-8编码汉字"系统"

#22


QT5等可用:
每个CPP加
#pragma execution_character_set("utf-8")

#23


每个CPP加
#pragma execution_character_set("utf-8") 
我是写好之后再加这个,结果有些没有乱码的也乱码了

不知道有没有全局设定的,我加入之后不影响前面写的代码

#24


头文件里面加
#pragma execution_character_set("utf-8")
 
就好了

#25


引用 24 楼 qb45532 的回复:
头文件里面加
#pragma execution_character_set("utf-8")
 
就好了

管用

#1


#2


这个讲的是Qt4的现在Qt5取消了那几个函数

#3


保存为utf8带bom的

#4



引用 3 楼 cai6811376 的回复:
保存为utf8带bom的

谢谢回复,我试过了也不行
网上说还要加上
#pragma execution_character_set("utf-8")
但是编译过程中说这个pragma无效,网上说的时VS2010支持这个指令。不知道怎么回事

#5


自己顶一下,希望大家能发表一下看法啊

#6


其实还是你的中文编码保持一致的问题,这里的一致包含很多地方:你的运行环境编码,你的源代码文本编码(这个尤其要当心),Qt5里边确实没有了4.8的那些你很熟悉的编码类及功能,但是同样Qt5有他的一套方式。最简便的办法是在需要统一编码的是后都toUnicode活着fromUnicode

#7


这确实是一种办法,只是程序中对所有的字符串使用这两个函数太麻烦了,而且效率也不清楚有多高

#8


可以不在源码里面写非英文吗?

#9


我现在是通过FileDialog选择的文件路径,路径中包含英文的QString显示是正常的,但是toStdString就乱码了

#10


我现在是通过FileDialog选择的文件路径,路径中包含 文的QString显示是正常的,但是toStdString就乱码了

#11


保存为utf8带bom,然后字符串用QStringLiteral();如QStringLiteral("中文字符串")

#12


有的时候我用UTF8还是乱码,用GBK就好了

#13


用 utf8编码、mingw 编译 好像没问题的

#14


引用 8 楼 ppdayz 的回复:
可以不在源码里面写非英文吗?

+1
这个是解决这个问题的标准办法。

#15


我的问题不是在源码里面写了中文,而是我通过QFileDialog读回来的文件路径里面包含中文比如桌面之类的汉字,我用toStdString就是乱码了,如果直接转换成toStdWString型的就可以正常显示

#16


QStringLiteral这个宏全部把字符串扩起来,就像QStringLiteral("中文"),还有就是生成的文件有记事本打开,点另存utf-8,覆盖,就是原本是utf-8但不带bom,只要用记事本另存utf-8再加上QStringLiteral就不会有问题了

#17


Qt5 乱码解决方法

#18


QT 知识.学习了!

#19


发了两个这个问题的帖子但是还是未解决,我就是从文件对话框中读取文件路径,然后toStdString转成string成乱码了,就是找不到解决办法,如果toStdWString 不会是乱码,但是我类接口就是string类型的

#20


如果使用vs2010编译器的话,把源码保存为带BOM的utf8格式,然后在文件头加上#pragma execution_character_set("utf-8")即可,如果出现“未知的杂注”是因为vs2010不认识该语句,打上vs2010 sp1补丁即可。希望对你有帮助!

#21


action_2->setText(QApplication::translate("MainWindow", "\346\226\207\344\273\266", 0, QApplication::UnicodeUTF8));

只是一个用到汉字时系统一种用法:\346\226\207\344\273\266 是UTF-8编码汉字"系统"

#22


QT5等可用:
每个CPP加
#pragma execution_character_set("utf-8")

#23


每个CPP加
#pragma execution_character_set("utf-8") 
我是写好之后再加这个,结果有些没有乱码的也乱码了

不知道有没有全局设定的,我加入之后不影响前面写的代码

#24


头文件里面加
#pragma execution_character_set("utf-8")
 
就好了

#25


引用 24 楼 qb45532 的回复:
头文件里面加
#pragma execution_character_set("utf-8")
 
就好了

管用