QT中字符串及其编码

(1)宏 QT_NO_CAST_FROM_ASCII

与之类似的还有QT_NO_CAST_TO_ASCII 

任何良好风格源代码或者愿意成为良好风格的源代码,都应该使用该宏。

该宏的作用在QString的Manual中有介绍:
Disables automatic conversions from 8-bit strings (char *) to unicode QStrings

其目的是,强制所有需要转换为Qt字符串的C中的const char*窄字符串都使用:

QLatin1String(const char*)

QObject::tr(const char *)
QString::fromXXXX
QTextCodec::toUnicode ( const char *)
...
不然将会编译时直接报错,比如 QString val("dbzhang800");   val = "dbzhang801";

在定义该宏的情况下,直接报错。因为没有 QString(bool) 这样的东西哈。

注意:字符串指针可能被转换成为bool或其他基本类型,而对于部分类,比如 QScriptValue,是有对应构造函数而不报告编译错误。

 参考 http://blog.csdn.net/dbzhang800/article/details/6675415 

(2)  MSVC 的转码动作 

不同的msvc的编译器对源代码的编码有不同处理,这里仅指msvc2008。
如果源码文件是带BOM的utf8,utf16等编码格式,它会有转码的动作。
这样一来,tr()包住的字符串将转码成时GBK、BIG5等system编码,与源文件所用的编码不同。

所以,msvc实际使用的字符和源代码中字符的编码可能不同,并且影响到程序运行setCodecForTr/setCodecForLocale/setCodecForCStrings和lingust翻译等工具

另外QT4.6中尽管简体中文的windows系统中使用gb2312,应该直接指定SYSTEM而不要指定GB2312 ,从而可以避免使用codecs插件。 

posted @ 2012-08-24 23:34  kevinzhwl  阅读(1179)  评论(0编辑  收藏  举报