目录

  • 一、解决方法:
    • 1. QT4版本
    • 2. QT5版本
  • 二、QString 为什么会乱码呢
  • 三、tr的使用

一、解决方法:

1. QT4版本

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

#include <QTextCodec>
int main(int argc, char **argv)
{......// 以下部分解决中文乱码//TextCodec *codec = QTextCodec::codecForName("System");    //获取系统编码QTextCodec *codec = QTextCodec::codecForName("utf8"); //LinuxQTextCodec::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。

Qt中文乱码解决办法相关推荐

  1. pycharm 运行控制台中文乱码解决办法

    pycharm 运行控制台中文乱码解决办法

  2. navicat for mysql 显示中文乱码解决办法

    navicat for mysql 显示中文乱码解决办法   最近遇到一个问题,用navicat for mysql 打开数据库时全都显示的是乱码(在用程序代码插入数据之前确保字符不是乱码),遇到问题 ...

  3. NetBeans中文乱码解决办法

    首先来看看网上的一篇文章:http://it.dengchao.org/neatbeans-problem-fedora/linux/ 在Windows和Linux(Fedora/Ubuntu/Red ...

  4. windows下git bash中文乱码解决办法

    一.解决办法1:(直接上图) 1.在git bash下,右键 出现下图,选择options: 2.选择"Text" 3.将"Character set"设置为 ...

  5. java控制台打印输出 中文乱码 解决办法

    java控制台打印输出 中文乱码 解决办法 问题:IDEA控制台打印时出现中文乱码 原因:java资源的编码和ideal的不一致 解决办法: 第一步 1:打开intelliidea安装路径,Intel ...

  6. Web前端——VScode打开html文件中文乱码解决办法

    VScode打开html文件中文乱码解决办法 1.打开VScode后,依次点击 文件 >> 首选项 >> 设置 2.打开设置后,依次点击 文本编辑器 >> 文件(或 ...

  7. QT中文乱码解决思路和方法汇总

    QT中文乱码解决思路和方法 中文编码一律使用QString::fromLocal8Bit()接口,原因是为了支持QT4版本.QStringLiteral()方法也可以使用,它是支持QT5版本的: CP ...

  8. php接受get参数乱码,如何解决php get 参数乱码问题,php中文乱码解决办法

    如何解决php get 参数乱码问题如何解决php参数乱码的问题,乱码php获取参数的解决方案:1.使用"iconv ('GB 2312 ',' UTF-8 ',$龚辉):"解决乱 ...

  9. php7 中文乱码_PHP 中文乱码解决办法总结分析

    PHP 中文乱码解决办法总结分析 更新时间:2009年07月30日 01:19:43   作者: 总之一句话,要解决PHP中文乱码最好最快的解决办法就是,页面申明的编码与数据库内部编码一致,如果页面申 ...

最新文章

  1. spring 测试demo乱码_spring框架的入门学习:AOP和面向切面的事务
  2. 简单的社交网络分析(基于R)
  3. Mybatis插入数据
  4. jsf组件不显示_JSF组件库–质量不只是零缺陷
  5. 阿里摩酷实验室计算机视觉团队校园招聘
  6. CCF CSP201903-2二十四点
  7. Python:OpenCV的默认优化
  8. [转载]仿射变换(Affine Transformation)
  9. VISTA组策略中关闭自动播放的位置
  10. 全量、增量 数据抽取 同步
  11. 计算机系新春祝福语,春节的祝福语
  12. 吉首大学2019年程序设计竞赛(重现赛)- A SARS病毒 (矩阵,欧拉降幂)
  13. 手机端html跑马灯效果,jQuery实现适用于移动端的跑马灯抽奖特效示例
  14. android 获取权限管理,Android获取超级管理员权限的实现
  15. 【图像】搜索相同,或者相似照片
  16. 【转载】损失函数 - 交叉熵损失函数
  17. 在word中插入pdf中的图片(矢量图)
  18. 高性能MySQL学习笔记(1) —— MySQL架构
  19. 还记得诺基亚手机上贪吃蛇小游戏吗?
  20. Golang性能分析

热门文章

  1. erlang NIF部分接口实现(二)类型系统和内存分配接口
  2. 基于android的停车场管理系统,基于Android的智能停车场的制作方法
  3. 2014全国计算机大赛,2014年全国大学生信息安全技术大赛举行
  4. vue a链接点击下载文件
  5. 网友怒赞:都是best....,何恺明编年史绝了
  6. 游戏开发心得——书籍篇——《游戏引擎框架》-专业工具
  7. 现代密码学上机程序c语言,现代密码学与加解密技术实验报告
  8. 团队协作效率,打造高绩效团队的核心
  9. 求三组长方体的表面积和体积
  10. 国外电子商务软件公司市场占有率排行