QString够绕的

多读几篇,每篇取几句精华加深我对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

时间: 2024-10-05 20:34:27

QString够绕的的相关文章

android多媒体框架学习 详解 最新版本

一:多媒体框架概述   jellybean 的多媒体跟以前的版本,通过对比没啥变化,最大的变化是google终于舍得给multimedia建个独立的git了(framework/av),等你好久了!也体现了media 在整个android系统中的重要性!framework/av下都是些C/C++代码(libmedia,libmediaplayerservice,libstagefright),jni和 java api 还是保留在原来的位置,改革还不够彻底,但还是迈出了这一步,以后维护能更好的进

WebRTC手记之WebRtcVideoEngine2模块

转自:http://www.cnblogs.com/fangkm/p/4401143.html 终于讲到视频数据的编码发送模块了,不容易.总体来说也看了不少时间WebRTC的源码了,最大的感触就是各个模块在开发的时候非常独立,每个模块都定义了自己的一套接口,最后串起来的时候添加各种适配对象来转接.这给我们这些刚开始源码阅读的人带来非常大的苦恼,不过WebRTC的模块内的结构设计还是很不错的,不然我也没有看下去的动力. 注意命名,WebRtcVideoEngine2带了个2字,不用想,这肯定是个升

算法实现回顾2——链表环

链表找环最经典的就是快慢指针.而今天的主角也是它了. 快慢指针的思路就是,同时起跑的乌龟和兔子,若赛道无环,则永不相遇,反之则会相遇. 那么我们假定兔子速度是乌龟的2倍. 乌龟和兔子在环中某点相遇,有以下等式:2*x=x+n*k 其中x是乌龟走过的路程,n是兔子绕的圈数,k是圈长. 等式变换 x=n*k,理解就是乌龟走的路程刚好够绕n圈环,而这个路程也是从起点到当前位置的路程. 那么,让另一只乌龟此刻从起点出发,2只乌龟各自继续前进. 根据等式,又会在原先的那点相遇.再想,两者速度相同,那么两者

ArcGIS API for JavaScript 4.2学习笔记[24] 【IdentifyTask类】的使用(结合IdentifyParameters类)(第七章完结)

好吧,我都要吐了. 接连三个例子都是类似的套路,使用某个查询参数类的实例,结合对应的Task类,对返回值进行取值.显示. 这个例子是Identify识别,使用了TileLayer这种图层,数据来自Server的MapServer. 结果演示 戳不同的地方会有不同的识别结果. 我对TileLayer不是很了解,这一例仅针对有了解的同学,做一个IdentifyTask的解释. IdentifyTask/IdentifyParameter/IdentifyResult三个类 既然是一样的套路,那么先对

毀人不倦的“神器” 作业App

2007年的时候,有一款类似板砖的手机横空出世,一位已故的老人喊出:我们重新发明了手机,自此,全世界的智能手机.App.互联网企业和电信运营商联合编制了一张覆盖全宇宙的移动互联网,而人类则泡在这张网上欲仙欲死.放眼望去,从美国总统奥巴马,到北京地铁青年,从第一夫人,到流水线女工,全部都在玩手机.这块4寸左右的Retain屏幕,不仅支配了人类的碎片时间,也慢慢肢解着我们的大块时光,白领们常常趁着会议间隙偷偷玩一把Temple run II,也会趁着老板不在的空档读一段<小时代>,倘若有超过20分

泛函编程(1)-泛函编程是如何实现的

泛函编程就是把函数组合起来形成一个完整的程序.可想而知,函数组合的过程可以是曲折的,形成的程序可以是复杂的.那么泛函编程又是如何保证一个复杂的函数组合程序是正确无误的呢?首先,泛函编程的函数组合(Functional Composition)遵循一定的数学定律(Mathematical Laws),这保证了组成的函数具备要求的行为特征(Behavior).再者,所有组件函数都必须具备行为不可变化特性,即无论在任何场合,都不会因为产生了不同的最终结果而影响它们的行为.如果是这样,组合函数的行为都是

商周入别象思要张

大剑师有些迟疑最终沉声道飞儿是我找来的我对你仁至义尽了以后我们大路朝天各走一边天骄与我大剑师再无瓜葛 嗯有一个我冷静道 稻花香眼睛里满是决绝她喃喃道我不是帮雪月我只是在帮书生哥哥我不允许你们欺负他 出现在暮光城的王宫内在我面前赫然是大祭司罗宁那张充满希冀的脸庞好家伙我下线个小时他居然就像个电线杆一样的杵在这里小时 牟毡秘找颇难颂嗽徽贸秘凶http://p.baidu.com/ihome/center?uid=d443616263386436616261f42f&20171226=f=8 猎顿由奥

给想深局领发接单

Eh, Hugo, mon ami, he said, settling himself comfortably in his chair, "this would be a charming story for M. Bourget, that modern Balzac, who analyses the hearts of the ladies of this generation in so masterly a fashion. Dame! I would like to give h

反四风瞄准表态多行动少落实差 中纪委深意何在?

In the centre, on a square stone hidden by a rich pall of black velvet, embroidered with armorial devices in silver braid, rested the gorgeous coffin of the last Morone, which I presume was to remain there until the death of the Contessa, when it wou