Qt中文乱码解决办法

这篇具有很好参考价值的文章主要介绍了Qt中文乱码解决办法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、解决方法:

1. QT4版本

中文乱码解决办法是在main.cpp文件加入:

#include <QTextCodec>
int main(int argc, char **argv)
{
    ......
    // 以下部分解决中文乱码
    //TextCodec *codec = QTextCodec::codecForName("System");    //获取系统编码
    QTextCodec *codec = QTextCodec::codecForName("utf8"); //Linux
    QTextCodec::setCodecForTr(codec);
    QTextCodec::setCodecForLocale(codec);
    QTextCodec::setCodecForCStrings(codec);
    // 以上部分解决中文乱码
    ......
}

Windows 系统里一般的记事本、编辑器、VC++ 开发环境等都是默认用 GBK 汉字编码,而 Linux 和 Qt 都是默认用 UTF-8 国际文字编码,所以文本显示乱码一般都是这个原因。

2. QT5版本

Qt5版本之后,类QTextCodec已经取消了QTextCodec::setCodecForTr()QTextCodec::setCodecForCString()这两个函数
上述方法也不能解决中文乱码的问题了。需要用新方法。

第一种:
先将对应的cpp文件用记事本打开,另存为UTF-8格式,然后在代码中,遇到中文字符,使用QStringLiteral(“中文”)进行修饰

第二种:
在头文件申明中加上

#pragma execution_character_set(“utf-8)

二、QString 为什么会乱码呢

真的是 QString 乱码了吗?QString 采用的unicode编码,在中文支持上不存在任何问题。
“我是汉字” 是C语言中的字符串,它是char型的窄字符串。

const char * str = “我是汉字”;
QString a= str;
//或
char str[] = “我是汉字”;
QString a= str;

QString内部采用的是 Unicode,它可以同时存放:
1、GBK中的字符"我是汉字"
2、BIG5中的字符"扂岆犖趼"
3、Latin-1中的字符"ÎÒÊǺº×Ö"。

所以源代码中的这8个字节"\xce\xd2\xca\xc7\xba\xba\xd7\xd6",该怎么转换成Unicode并存到 QString 内?按照GBK、BIG5、Latin-1还是其他方式…

在你不告诉它的情况下,它默认选择了Latin-1,于是8个字符"ÎÒÊǺº×Ö"的unicode码被存进了QString中。最终,8个Latin字符出现在你期盼看到4中文字符的地方,所谓的乱码出现了

QString的工作方式

const char * str = “我是汉字”;
QString a= str;

其实很简单的一个问题,当你需要从窄字符串 char* 转成Unicode的QString字符串的,你需要告诉QString你的这串char* 中究竟是什么编码?GBK、BIG5、Latin-1

理想情况就是:将char* 传给QString时,同时告诉QString自己的编码是什么:

就像下面的函数一样,QString的成员函数知道按照何种编码来处理 C 字符串

QString QString::fromAscii ( const char * str, int size = -1 )
QString QString::fromLatin1 ( const char * str, int size = -1 ) 
QString QString::fromLocal8Bit ( const char * str, int size = -1 )
QString QString::fromUtf8 ( const char * str, int size = -1 )

另外还有一种防止乱码的方法,此种方法也可以解决国际化问题导致的乱码,就是使用翻译文件。在源码中统一使用英文。在翻译文件中实现不同版本的语言。

不得不提最后一种比较高级的方法:QStringLiteral宏它可以直接生成Unicode字符串保存在可执行文件中的只读区域。这样运行时不会发生任何转换。可以显著提高程序运行效率。
但是QStringLiteral需要编译器支持,如支持C++11就具有这种特性。Qt高版本一般也支持。具体性能方面的影响请看Qt的帮助文档。

三、tr的使用

用tr的有两类人:

1.因为发现中文老出问题,然后搜索,发现很多人用tr,于是他也开始用tr

2.另一类人,确实是出于国际化的需要,将需要在界面上显示的文件都用tr包起来,这有分两种:

  (1) 用tr包住英文(最最推荐的用法,源码英文,然后提供英文到其他语言的翻译包)

  (2) 用tr包住中文(源码用中文,然后提供中文到其他语言的翻译包)

注意:如果你正在用tr包裹中文字符,却不属于情况(2),那么你是在误用tr,你需要的是QString,而不是tr,

如果你确实属于(情况2),请做好心理准备,你可能还会遇到很多困难。

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

QString text1 = QObject::tr(“hello”);
QString text2 = QString(“hello”);

tr是用来实现国际化,如果你为这个程序提供了中文翻译包(其中hello被翻译成中文"你好"),那么text1的内容将是中文"你好"。

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

你如果使用QObject::tr,你应该全部用英文表示,然后后面借助Linguist翻译成中文,就不会乱码了。

QObject::tr()在QObject的manual,QCoreApplication::translate()在QCoreApplication的manual中。
tr内内部调用的是translate。文章来源地址https://www.toymoban.com/news/detail-446868.html

到了这里,关于Qt中文乱码解决办法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 解决Qt Creator中文乱码的问题

    使用QStringLiteral()包裹中文字符串

    2024年02月01日
    浏览(34)
  • 解决办法:IDEA 控制台中文乱码的几种解决方案

    如果没有进行适当的配置,IntelliJ IDEA 可能会导致控制台和配置文件中出现中文乱码等问题,这会严重干扰编码过程以及问题追踪。本文汇总了解决 IDEA 中常见中文乱码问题的方法,本文的解决办法为大家提供帮助。 在IDEA 控制台输出中文的时候,出现乱码,现象如下: 2.1

    2024年02月04日
    浏览(57)
  • IntelliJ IDEA 中的控制台输出日志中文乱码之解决办法

    IntelliJ IDEA 中的控制台输出日志中文乱码通常是由于控制台使用的默认字符编码与系统不匹配所致。要解决这个问题,请尝试以下方法: 打开 IntelliJ IDEA, 在顶部菜单栏查看 Run/Debug Configurations 列表。这是您项目中所使用的配置列表。 选择您要修改的 Run/Debug Configuration。如果有

    2024年02月08日
    浏览(69)
  • VS2013+QT5.5 中文乱码问题 解决方案

    最近使用VS2013+QT5.5 创建了一个项目,它的菜单是由代码创建的、   发现运行之后全部是乱码

    2024年02月13日
    浏览(43)
  • Qt的TCP传输数据,出现中文乱码的解决方案

    Qt的TCP传输数据中文乱码的问题,可能是由于编码不一致导致的。可以尝试以下方法解决: 在发送数据之前,将中文字符串进行编码转换。例如,将QString类型的中文字符串转换成UTF-8编码的字节数组,可以使用QString的toUtf8()函数,示例代码如下: QString str = \\\"中文字符串\\\"; QB

    2024年02月09日
    浏览(61)
  • 彻底解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)

    原文链接: 这篇文章有点长,内容有点多,如果时间急迫,可以直接翻页去末尾看结论。红色字体加粗的。 1、cpp或h文件从window上传到Ubuntu后会显示乱码, 原因是因为ubuntu环境设置默认是utf-8,Windows默认都是GBK. 我们使用的Windows系统本地字符集编码为GBK。 2、Windows环境下,Qt C

    2024年02月05日
    浏览(47)
  • VSCode + GCC编译器(MinGW)开发环境中文字符乱码问题踩坑与解决办法

    问题背景 在较长一段时间里,C/C++开发者所使用的集成开发环境(IDE)要么是比较重量级的 VS(Visual Studio) ,要么是 Codeblocks·、·Visual C++ 6.0 等轻量级IDE,又或者是诸如 notepad++、sublime text 等文本编辑器+ GCC编译器 +命令行工具的组合式开发环境。这几种开发方式要么太过庞

    2023年04月22日
    浏览(67)
  • Android Studio中App Inspection 或Profiler里网络请求数据显示中文乱码解决办法

    效果如下: 解决办法 Android studio在 Help中找到Edit Custom VM Options… 并打开文件,在文件中添加 最后重启AS可解决

    2024年02月12日
    浏览(52)
  • VScode注释中文时乱码怎么办?VScode中文注释乱码问题的解决方法

    不管是在哪一种编辑器上,都会有自动默认的一种编码格式,在vscode编辑器中默认的编码格式是utf-8,但是在注释的时候,因为使用的字符会不一样,所以可能存在着默认的配置文件,有可能是其他的编码格式,所以因为编码格式不对应,导致了在注释的时候出现了乱码的情

    2024年02月11日
    浏览(59)
  • response 中文乱码的两个解决方法

    使用输出流输出数据是一种编码解码的过程,输出流对象是从response获取出来的,源头上就是从Tomcat中取出来的,Tomcat试用的编码是ISO-8859-1,而浏览器默认的编码是操作系统的字符集,也就是GBK,由于编码和解码的字符集不同,所以造成了乱码的结果。 解决的思路就是告诉浏

    2024年02月11日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包