QString 是不存在中文支持问题的,很多人遇到问题,并不是本身 QString 的问题,而是没有将自己希望的字符串正确赋给QString。

很简单的问题,"中文"这样写的时候,它是传统的 char 类型的窄字符串,我们需要的只不过是通过某种方式告诉QString 这四个汉字采用的那种编码。而问题一般都出在很多用户对自己当前的编码没太多概念。

#include <QtGui/QApplication>
#include <QtGui/QLabel>

intmain(intargc, char **argv)
{
QApplicationapp(argc, argv);
QStringa= "我是汉字";
QLabellabel(a);
label.show();
returnapp.exec();
}

编码,保存,编译,运行,一切都很顺利,可是结果呢:

  • 多数用户看到

    其他用户看到

    ÎòêÇoo×Ö

    我æ˜ˉæ±‰å —

出乎意料,界面上中文没显示出来,出现了不认识字符。

最常用的3个编译器(微软VS的中的cl,Mingw中的g++,Linux下的g++),源代码分别采用 GBK 和 不带BOM的UTF-8  以及 带BOM的UTF-8 这3中编码进行保存。

明确概念0:

  • "我是汉字" 是C语言中的字符串,它是char型的窄字符串。上面的例子可写为

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

char str[] = "我是汉字";
QString a= str;

明确概念1:

  • 源文件是有编码的,但是这种纯文本文件却不会记录自己采用的编码

这个是问题的根源,不妨做个试验,将前面的源代码保存成GBK编码,用16进制编辑器能看到引号内是ce d2 ca c7 ba ba d7 d6这样8个字节。

现在将该文件拷贝到正体(繁体)中文的Windows中,用记事本打开会什么样子呢?

...
QStringa= "扂岆犖趼";
QLabellabel(a);
label.show();
...

那么放到欧美人的Windows系统中,再用记事本打开呢?

...
QStringa= "ÎòêÇoo×Ö";
QLabellabel(a);
label.show();
...

同一个文件,未做任何修改,但其中的8个字节ce d2 ca c7 ba ba d7 d6,对用GBK的大陆人,用BIG5的港澳台同胞,以及用Latin-1的欧洲人看来,看到的却是完全不同的文字。

明确概念2:

  • 如同我们都了解的'A'与'\x41'等价一样。

GBK编码下的

const char * str = "我是汉字"

等价于

const char * str = "\xce\xd2\xca\xc7\xba\xba\xd7\xd6";

当用UTF-8编码时,等价于

const char * str = "\xe6\x88\x91\xe6\x98\xaf\xe6\xb1\x89\xe5\xad\x97";

注意:这个说法不全对,比如保存成带BOM的UTF-8,用cl编译器时,汉字本身是UTF-8编码,但程序内保存时却是对应的GBK编码。

明确概念3:

  • QString 内部采用的是Unicode。

QString内部采用的是 Unicode,它可以同时存放GBK中的字符"我是汉字",BIG5中的字符"扂岆犖趼" 以及Latin-1中的字符"ÎòêÇoo×Ö"。

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

在你不告诉它的情况下,它默认选择了Latin-1,于是8个字符"ÎòêÇoo×Ö"的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 )

单QString 只提供了这几个成员函数,远远满足不了大家的需求,比如,在简体中文Windows下,local8Bit是GBK,可是有一个char串是 BIG5 或 Latin-2怎么办?

那就动用强大的QTextCodec吧,首先QTextCodec肯定知道自己所负责的编码的,然后你把一个char串送给它,它就能正确将其转成Unicode了。

QString QTextCodec::toUnicode ( const char * chars ) const

可是这个调用太麻烦了,我就想直接

QString a= str;

QString a(str);

这样用怎么办?

这样一来肯定没办法同时告诉 QString 你的str是何种编码了,只能通过其他方式了。这也就是开头提到的

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));

注意:在一个cpp文件中修改后会影响整个工程。

QString 字符编码相关推荐

  1. 字符编码、QString编码、Qt界面乱码问题总结

    目录 一.术语解释 1.编辑器(editor) 2.编译器(compiler) 3.源文件字符编码 4.执行文件字符编码 5.Unicode 二.Qt中的字符串 1.char*和std::string ...

  2. 【QT小记】QT中QString与常用字符编码转换

    前言 记录在使用QString的过程中与常用字符编码的转换方法以及乱码的可能原因和解决方法 例子 字符串 编码方式 十六进制 林 Unicode 0x6797 GBK 0xC1D6 UTF8 0xE6 ...

  3. Qt字符编码,创建中文文件

    1.代码文件本身编码: 2.Qt中用于控制读入和写出文件系统时的字符编码由QTextCodec::setCodecForLocale()所决定.一般不用设置,Qt跟系统交互时会根据系统的Locale来 ...

  4. QTCreator中字符编码问题以及WINDOWS API A/W两种版本的说明

    首先说明下windows中API有两种结尾的一种以A结尾一种以W结尾, A代表ANSI编码,W代表UTF-16编码,  这里承清下unicode不是编码方式, 而是字符集. ANSI编码对于不同的国家 ...

  5. qt字符编码及数据格式转换

    1.字符编码 QString: QString内部可能是使用unicode字符集来存储文字,UTF-8以字节为单位对Unicode进行编码.QString里面的汉字是UTF-8编码的字符集,QStri ...

  6. QT学习——Qt工具介绍,Qt助手使用,第一个Qt程序,Qt字符串和字符编码

    一.Qt主要工具介绍 1)qt助手(assistant) 2)qt构建器(qmake) 3)qt设计师(designer) 4)qt转换器(uic) 5)qt资源编译器(rcc) 6)qt元对象编译器 ...

  7. C++ 编译器对字符编码的要求和处理方式

    http://blog.csdn.net/dbzhang800/article/details/7540905 长期以来,很多人都清楚,一旦C++源码中直接使用了中文,这样的源码想要跨平台(I18N) ...

  8. Qt中的字符编码转换:UTF8、Unicode、GBK、ASCII、16进制字符、16进制数值

    文章目录 前言 简述 ASCII GBK Unicode UTF-8 应用场景 开发环境 编码转换 16进制数值转换为16进制字符 16进制数值转化为字符串 16进制字符串转换为Unicode字符串 ...

  9. java ascii 编码方式_JAVA 的ASCII字符编码一览表

    JAVA 的ASCII字符编码一览表 二进制 十进制 十六进制 缩写 可以显示的表示法 名称/意义 0000 0000 0 00 NUL ␀ 空字符(Null) 0000 0001 1 01 SOH ...

最新文章

  1. 面试题总结-算法部分
  2. delegate委托
  3. Fabric架构演变之路
  4. 第十一节:WebApi的版本管理的几种方式
  5. Reset Password 重置密码 (CentOS 5,6,7 ; Juniper Networks: SRX100 )
  6. 10.2.5 监视文件.
  7. java学习之流程控制
  8. 失业几个月找不到工作是一种怎样的体验?
  9. JSK-347 打印图形【打印图案】
  10. 尚硅谷大数据技术之Hadoop(入门)
  11. TINA电路仿真软件安装教程
  12. 逆矩阵在密码学中的应用(希尔密码原理)
  13. SafeArea的使用
  14. php ckfinder 无效请求.,解决nginx和php使用ckfinder无法上传大文件的问题
  15. 教你用Python感受量子霸权
  16. 【基础入门题013】求连续根号的值
  17. xcode提交app时出现icon缺少167.png图片的问题
  18. 神经网络有哪些基本功能,常见的神经网络有哪些
  19. python输出学生姓名成绩学号_打印所有学生的姓名,学号,性别,年龄,成绩信息...
  20. orge_src版编译与安装

热门文章

  1. java观察者模式在spring中的应用_在Spring中使用观察者模式
  2. 这篇Nature子刊文章的蛋白组学数据PCA分析竟花费了我两天时间来重现|附全过程代码...
  3. “harmony”整合不同平台的单细胞数据之旅
  4. Linux学习 - awk使用
  5. Mac技巧|如何在 MacBook上设置一位数登录密码
  6. php按照二维数组某个字段排序,PHP 二维数组根据某个字段排序
  7. 1978:【18NOIP普及组】标题统计
  8. 德芙网络营销策略ppt_德芙网络营销方案
  9. 【ES6(2015)】Function函数
  10. python怎样实现多表连接_Python Day45多表连接查询