码迷,mamicode.com
首页 > 其他好文 > 详细

QString够绕的

时间:2014-10-09 01:35:37      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   使用   ar   for   strong   

多读几篇,每篇取几句精华加深我对QString的理解。

------------------------------------------------------------------

QString内部仍采用UTF-16存储数据且不会改变,但它读char*的时候(C++语言里最常见的形式,特别对于const来说是这样),默认按照latin1来解读字符串,这就造成乱码。

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"));

设置QString默认采用的编码。而究竟采用哪一个,一般来说就是源代码是GBK,就用GBK,源代码是UTF-8就用UTF-8。但有一个例外,如果你保存成了带BOM的UTF-8而且用的微软的cl编译器,此时仍是GBK。

一句话,读中文路径以及写入XML都容易,几乎什么都不用设置。唯独源代码里的中文要千万小心才能正确解析,如下:
QTextCodec *ttt = QTextCodec::codecForName("GBK"); // 上面什么都不写,只写这句就已经够了。
writer.writeTextElement("Chinese5",ttt->toUnicode("中国")); //

参考:

http://hi.baidu.com/dbzhang800/item/431f800fcb653e6dd55a1142
http://www.360doc.com/content/12/0511/18/6828497_210377394.shtml

------------------------------------------------------------------

源码必须是UTF-8,QString需要它
在Qt5中,我们将把QString的8位(8-bit)成员函数的默认编码从Latin 1改为UTF-8。
我建议使用QLatin1String来封装这些字符串,尤其是你正将它们用于一个有QLain1String重载的QString的函数。

你要么用UTF-8重写你的代码,要么你需要用合适的QLatin1String或QTextCodec::toUnicode函数来封装这些字符串。我比较建议使用前一个选项:在你的源代码中使用UTF-8。

http://blog.qt.digia.com/cn/2012/05/16/source-code-must-be-utf-8-and-qstring-wants-it/

------------------------------------------------------------------

直接在代码中使用中文字符串,在Windows下无论用QCreator还是Visual Studio 都会出现中文字符串显示乱码问题
原因是QString默认使用Ascii编码,要手动加入代码
“QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale())”才能解决问题
为什么Qt不默认就是使用QTextCodec::codecForLocale呢?这对各个国家都没有冲突啊

呵呵,如果这样做,Qt岂不是知道倒退了10多年? 你提到这个是10多年前的做法吧,直接导致同一个程序无法跨平台了。在utf8盛行的时代,而VC6/7/8/9/…,默认采用locale字符集,也算是与时代有些格格不入了。
http://qt-project.org/forums/viewthread/19144

QString够绕的

标签:style   blog   http   color   io   使用   ar   for   strong   

原文地址:http://www.cnblogs.com/findumars/p/4011848.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!