在使用 Qt5
进行开发的过程当中遇到了一些跨平台的中文编码转换问题,而后进行了一番调查,这里作个总结,但愿能帮上他人linux
首先咱们认识一下 UNICODE, UNICODE 是由微软等多个知名公司发布的一种字符集标准,具体编码实现有 UTF-8, UTF-16 和 UTF-32 这三种编码格式。而GBK字符编码属于另外一套字符集,相似的还有Big5字符集。编程
而后介绍一下 UCS ,UCS 是 ISO 组织发布的一种相似 UNICODE 的字符集标准,后来二者开始合流,编码基本一致。这里须要知道的是 UCS-2 和 UTF-16 之间的关系,UCS-2 规范至关于 UTF-16 规范的 子集,由于 UTF-16 有扩展字符为变长,而 UCS-2 是固定两个字节windows
windows 自从 windows 2000 后 就开始使用 UNICODE 字符集,具体编码是 UTF-16 编码。而后从 vista 以后开始支持 UNICODE 5.0 标准,对 UTF-16 的支持也更加完善,支持 UTF-16 surrogate 扩展字符的显示。对于windows的开发人员而言,咱们须要知道 windows 上具体表明 UTF-16 编码的数据类型,这里以 visual studio 系列 IDE 和所带的编译器为例,Qt这里也使用了 msvc 编译器环境函数
UTF-16
的数据类型是 wchar_t
,也就是咱们工程设置选择的宽字符。可能有人会问,UTF-16 是变长编码,扩展编码会用到4个字节,wchar_t 怎么表示?遗憾的是的确无法表示,这更像是 UCS-2
标准,可是咱们须要知道的是 windows 的内核的确是 UTF-16 的,只是编程接口只提供了两字节的 wchar_t。不过这些扩展字符基本用不到,因此咱们不用过多考虑,若是你须要了解更多能够自行查阅资料,博主暂时未深刻#if defined(_MSC_VER) && (_MSC_VER >= 1600) # pragma execution_character_set("utf-8") #endif
注意:文件格式使用 UTF-8 可能出现 "error C2001: 常量中有换行符" 的状况,这时候能够改文件格式为 UTF-8 BOM 来解决问题。实际上还有一些其余的解决方案,你们能够自行搜索工具
linux系统默认使用的 UTF-8 编码,对于linux的开发人员而言,就简单多了,都用 UTF-8 就万事大吉了,这里使用 QtCreator + gcc 来作讲解开发工具
若是咱们须要彻底使用 GBK 编码来开发也是能够的,须要在 Qt 工程的 main 函数加入下面的设置,并使用 GBK 格式的源文件编码
QTextCodec *codec = QTextCodec::codecForName("gbk"); QTextCodec::setCodecForLocale(codec);
QString
是 UNICODE
编码,确切来讲是 UTF-16
编码。Qt程序想正确显示中文,那么就须要把其余编码的字符串转为 UNICODE
编码。而后咱们来讲一下 QString 的几种构造方式code
//这种是默认传入的字符串为 UTF-8 QString strTest = QString("我是"); //这个就是从 UTF-8 字符串构造,和上面同样 QString strTest = QString::fromUtf8("我是"); //这个也是默认字符串为UTF-8 QString strTest = QString::tr("我是"); //这个编码根据系统来,windows就是GBK,linux就是UTF-8 QString strTest = QString::fromlocal8Bit("我是"); //这个就是 ASCII 这种了,单字节的 QString strTest = QString::fromLatin1();
注意接口
QTextCodec* gbkcodec = QTextCodec::codecForName("gbk"); //下面是GBK编码的字符串 const char* bdata = "你好,世界" //使用TextCodec库来转换gbk到unicode QString strGBK = gbkcodec->toUnicode(bdata);
最后咱们推荐使用 UTF-8 编码的方式,这样能够方便兼容 windows 和 linux 多平台utf-8