QT字符串编码知识汇编

各种概念

(一)各种表示字符的变量长度是不同的

sizeof(char) = 1;

sizeof(wchar_t) = (windows下是2或者Linux下是4)

(二)源代码文件是有编码的

但作为“纯文本”是不会记录自己的编码。

(三)QString、QChar是支持unicode

QChar是基于16bit的 ushort实现。(注意不是wchar_t)

QString内部是基于QChar实现; (注意不必然是QChar和字符数相等)

但在Windows下1个QChar表示一个字符,范围为UCS2;在linux下2个QChar表示一个字符,范围为UCS4。 

============================================= 

各种和字符编码有关的内容

(1)源代码的编码决定了其中全部字符的编码,使用何种转换函数

*msvc2008在编译前会有转码过程,会把任何无bom的文件当成locale,任何有bom的文件转换成locale 

(2) QTextCodec::setCodecForTr 

设置tr函数翻译的内容,这个翻译是“动态”的,也就是在运行时tr函数采用正确的编码,

*tr函数就是QApplication::translate函数的马甲。

*由于msvc会自动转码,所以此处应该设置最终运行程序使用的编码,而不一定是源代码的编码。 

(3) 宏CODECFORTR

在pro文件中,说明TR部分的字符编码,主要是明确告诉linguist / lupdates的字符的编码 

*此处是没有转码,即linguist / lupdates 使用就是源代码文件中的字符

*不明:无论源代码文件是utf-8(with bom) 还是ascii(system/gbk),而无论指定为system还是utf-8,都可以正确显示;但其他编码则不行。

(4)宏CODECFORSRC

在pro文件中,说明源代码文件的编码

使用条件:编译器创建的程序使用编码和源代码的编码不一致,目前来看就是只有msvc系列。 

(5)QTextCodec::setCodecForLocale

指定本地字符编码,对于任何未明确说明的字符串所使用的编码

(6)QTextCodec::setCodecForCStrings

指定QString,对于任何未明确说明编码的字符串所使用的编码 

 (7)QString/QChar

QT中字符串存储的基本类,内部采用2字节的unicode(utf-16)作为存放字符串的基本内容。任何非utf-16的编码都要经过适当转换(fromXXX),再做存储 。

 *fromUtf16的输入参数是ushort;而fromWCharArray是wchar_t;但具体使用时两者基本等效。

*QString没有直接的构造函数接收wchar_t[]或者short[],但 QChar有针对short的构造函数。

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

QTextCodec是专门进行代码转换的类,可以明确完成各种编码转换。对于少量的、特别字符转换,一般可以采用。

QByteArray encodedString = "...";
QTextCodec *codec = QTextCodec::codecForName("KOI8-R");

QString string = codec->toUnicode(encodedString); 

 (9)宏QT_NO_CAST_FROM_ASCII  和 QT_NO_CAST_TO_ASCII

在pro文件中使用,阻止 char*直接和QString进行隐式相互转换,要求明确定制char*的编码格式(使用QLatin1String,QString::fromXXX;QObject::tr)

 

 ================================================

各种工具的事情

(a)QtCreator的编辑器

QtCreator编辑器可以选择默认的编码,以及对bom的处理

源代码文件:无特别的之处。

qrc,ui文件:不能直接编辑,只能间接使用Resource Editor 和 Designer进行编辑,并且本身是xml文件;

pro文件:可以编辑,但qmake无法解析带有bom的文件 。所以如果选择自动添加bom信息则会导致分析pro文件报错异常

pri文件:带bom信息不能正常include,但不一定报错,但会发现无效

(b)linguist

依赖ts文件,无其他 

*linguist查看源代码文件窗口直接把源代码当作latin1读取,所以仍然无法正确查看到其中非latin1字符  

(c)lupdate

指定QT_CODECFORTR和QT_CODECFORSRC即可 

(d)lrelease

lrelease 是 Linguist 工具链的一部分,可作为独立程序使用。它将 .ts 文件转换成压缩的 .qm 文件,供 QTranslator 使用。

读入.ts 文件(.ts文件是包含编码信息的xml文件,不存在乱码的基础)

将读入的字符串编码 后按某种格式存储后 .qm 文件中

默认情况下,采用latin1编码;对于.ts文件中包括defaultcodec的,采用该编码 

*lrelease涉及到编码,所以器需要用Qt的插件(比如qcncodecs4.dll)。目前由于种种原因,lrelease无法加载插件,也没有补丁。

目前折中的办法:如果你在简体中文的windows系统中使用gb2312,那么在指定编码是,直接指定SYSTEM而不要指定GB2312 ,则可以避免使用codecs插件。

(e)winres

  只能处理locale的文件

对于直接处理的文件(一般是rc文件),会直接作为locale处理,对于任何非ascii会产生乱码。

其中如果有include,则会将包括bom在内部分也包括进去,并进而导致有无法识别的字符。

综上,对于rc文件和其中引用的文件,都要用locale编码。 

转载于:https://www.cnblogs.com/kevinzhwl/archive/2012/08/27/2658627.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值