QT5 编码

QString内部保存的是unicode, 如下初始化QString时, QString的构造函数将会调用fromUtf8()转换到unicode,然后存储在内部。

1
2
//QString converts the const char * data into Unicode using the fromUtf8() function.
QString str = "Hello"; 

以上对于utf8兼容的ascii字符集来说,是没有问题的。 但是对于其他字符集(比如GBK),则会出现问题。 例如下面的代码, 可能会出现问题:

1
2
//QString converts the const char * data into Unicode using the fromUtf8() function.
QString str = "中文汉字";

以上代码, QString会尝试将const char*通过fromUtf8()转换成unicode。 如果当前源文件是utf8编码的, 且编译器能正确的处理utf8编码的源文件, 那么一切将正常。 但是, 当源文件的保存编码不是utf8(比如GBK)时, 实际上编译器处理这段代码的时候, 会将这些字符串以GBK编码的结果写在生成的可执行文件中。 程序运行时,QString调用fromUtf8()尝试解码一段utf8编码的字符串时, 将出现问题, 在GUI上会显示乱码。

当需要处理非utf8兼容字符集时,需要注意一下几点,以保证可以跨平台编译:

  1. 源文件以带bom的utf8保存, 且文件结尾统一使用unix结尾符格式。 visual studio可以通过"文件->高级保存选项", 其中编码选择"Unicode(UTF8带签名)代码页65001", 行尾选择"Unix(LF)", 或者通过安装Format on Save这个扩展来结局问题。 其他编辑器按照一定的方法也可以设置。
  2. 如果使用的是visual studio编译器,需要设置编译器的/utf-8选项, 让cl.exe正确的处理utf8编码的源文件。

对于从网络或者文件读取的字符串,需要动态处理的时候, 则需要自己通过QTextCodec进行解码处理。 比如以下代码处理一段网络获得的GBK编码的字符串,以便正确显示:

1
2
3
const char *msg = ... ; //这是网络获取的GBK编码的字符串
QTextCodec* codec = QTextCodec::codecForName("GBK");
QString decodedText = codec->toUnicode(msg);
使用 Hugo 构建
主题 StackJimmy 设计
© 2024 unnamed.top 沪ICP备2024073152号