- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
QString 与中文问题
2010-07-11 17:04
(更新:本文的姊妹篇 Qt 中 translate、tr 关系 与中文问题 )
首先呢,声明一下,QString 是不存在中文支持问题的,很多人遇到问题,并不是本身 QString 的问题,而是没有将自己希望的字符串正确赋给 QString。
很简单的问题,我是中文这样写的时候,它是传统的 char 类型的窄字符串, 我们需要的只不过是通过某种方式告诉 QString 这四个汉字采用的那种编码。而问题一般都出在很多用户对自己当前的编码没太多概念,
于是
一个简 单的 Qt 程序
下面这个小程序,估计大家会感到比较亲切。似乎有相当多的中文用户尝试写过这样的代码:
#include QtGui/QApplication
#include QtGui/QApplication
#include QtGui/QLabel
int main(int argc, char **argv)
{
QApplication app(argc, argv); QString a= 我 是 汉 字 ; QLabel label(a); label.show();
return app.exec();
}
编码,保存,编译,运行,一切都很顺利,可是结果呢:
多数用户看到 其他用户看到
多数用户看到 其他用户看到
?òê?oo×?
??‘??ˉ?±‰? —
出乎意料,界面上中文没显示出来,出现了不认识字符。 于是开始用搜索引擎搜索,开始上论坛发帖或抱怨
最后被告知,下面的语句之一可以解决问题:
QTextCodec::setCodecForCStrings(QTextCodec::codecForName(GB2312)); QTextCodec::setCodecForCStrings(QTextCodec::codecForName(UTF-8));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName(GB2312)); QTextCodec::setCodecForCStrings(QTextCodec::codecForName(UTF-8));
两条指令挨个一试,确实可以解决(多数用户是第一条,其他用户是第二条)。那么,为什么会这样呢?
两种乱码什么时候出现
对这个问题,我想大家可能都有话说。在继续之前,我们先列个表,看看两种乱码分别在那种情况下出现:
我们只列举大家最常用的 3 个编译器(微软 VS 的中的 cl,Mingw 中的 g++,Linux 下的g++),源代码分别采用 GBK 和 不带BOM 的UTF-8 以及 带BOM 的UTF-8 这 3 中编码进行保存。
源代码的编码
编译器
结果
cl
1
*
GBK
mingw-g++
1
*
g++
1
cl
2
UTF-8(不带 BOM)
mingw-g++
2
g++
2
*
cl
1
UTF-8(带 BOM)
mingw-g++
g++
2
编译失败
采用 3 种不同编码保存的源代码文件,分别用 3 种不同的编译器编译,形成 9
种组合,除掉一种不能工作的情况,两种乱码出现的情况各占一半。
从中我们也可以看出,乱码和操作系统原本是没有关系的。但我们在 Windows 一般用的 GBK,linux 一般用的是不带 BOM 的 UTF-8。如果我们只考虑带*的情况, 也可以说两种乱码和系统有关。
QString 为什么会乱码呢
真的是 QString 乱码了吗?我们可以问问自己,我们抱怨的对象是不是搞错了?
继续之前,先明确几个概念:
明确概念 0:
我是汉字 是 C 语言中的字符串,它是 char 型的窄字符串。上面的例子可写为
const char * str = 我是汉字; QString a= str;
const char * str = 我是汉字; QString a= str;
或
char str[] = 我是汉字; QString a= str;
char str[] = 我是汉字; QString a= str;
等
明确概念 1:
源文件是有编码的,但是这种纯文本文件却不会记录自己采用的编码
这个是问题的根源,不妨做个试验,将前面的源代码保存成 GBK 编码,用 16 进制编辑器能看到引号内是 ce d2 ca c7 ba ba d7 d6 这样 8 个字节。
现在将该文件拷贝到正体(繁体)中文的 Windows 中,用记事本打开会什么样子呢?
...
...
QString a= 扂岆犖趼;
QLabel label(a); label.show();
...
那么放到欧美人的 Windows 系统中,再用记事本打开呢?
...
.
您可能关注的文档
最近下载
- 第九讲混一南北与中华民族大统合(元朝时期)-第十讲中外会通与中华民族巩固壮大(明朝时期)-中华民族共同体概论专家大讲堂课件.pptx VIP
- 成人术中非计划低体温预防与护理-2024中华护理学会团体标准.pptx VIP
- 2025年-《中华民族共同体概论》试题及答案解析-新版.pdf VIP
- 《中华民族共同体概论》试题汇总.pdf VIP
- 2023版思想道德与法治绪论1我们处在中国特色社会主义新时代.pdf VIP
- 2025年-中华民族共同体概论-第八讲 共奉中国与中华民族内聚发展(辽宋夏金时期).docx VIP
- Ti-Mg脱氧工艺对低碳钢板气电立焊接头组织和性能的影响.pdf VIP
- 2025年“国学小名士”专题知识竞赛题库500题(含答案).docx
- 新版中华民族共同体概论课件第八讲共奉中国与中华民族内聚发展(辽宋夏金时期)-2025年版.pdf VIP
- 初一英语上册英语竞赛试题.doc VIP
原创力文档


文档评论(0)