分享

Qt 编码设置

 guitarhua 2012-04-29
Qt 编码设置
2011-10-25 15:05

QT的字符编码转换

82人阅读 评论(0) 收藏 举报

开发的终端需要接入两个外设,二代证读取设备和打印机。

让人郁闷的是,两个设备的字符编码与终端系统不一致,一开始耗了不少时间,后来才注意到字符编码的问题。

二代证读出来的数据都是用unicode编码的,而打印子要求穿过去的数据要转换成unicode编码。

查阅了help文档,发现QT有自己的转换函数,那真是再好不过了。

首先是二代证的数据:

QString text = QTextCodec::codecForName("GB2312")->fromUnicode(str);

终端系统用的是GB2312编码,str是从二代证读出来的unicode编码的数据缓冲区

这样得到的text,就可以在终端上正常显示了。

 

关于打印机嘛,正好相反,它是要求我们传的数据转成unicode:

printBuf = QTextCodec::codecForName("GB2312")->toUnicode((text));

 

至于UTF-8或者其他的编码转换都雷同,查看qt帮助文档即可。


1.
Qt Creator -> 工具 -> 选项 -> 环境 -> 语言
Qt Creator本身界面的语言选择
与cpp文件编码无关,与可执行文件显示编码无关
重新打Qt Creator 此设置才能生效
这个唯一选择<Chinese>


2.
Qt Creator -> 工具 -> 选项 -> 环境 -> 默认文件编码
决定cpp文件编码
不同平台下,此设置要相同,如果不同,cpp文件会有好多乱码,且不能被编辑,但不影响编译;
重新打Qt Creator 此设置才能生效
这个推荐选<UFT-8>,因为linux下是这个;
如果不同:
选择<根据编码重新载入>这步选择文件的原始编码
再<根据编码保存>这步选择目标编码


3.
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
只与这个相关QString str = tr("中文");
注意,相关的是转换过程,QString本身是unicode,不会影响到QString
这个必须和<2. Qt Creator -> 工具 -> 选项 -> 环境 -> 默认文件编码>相同
推荐选<UFT-8>


4.
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
只与这个相关QString str = QString("中文");
注意,相关的是转换过程,QString本身是unicode,不会影响到QString
这个必须和<2. Qt Creator -> 工具 -> 选项 -> 环境 -> 默认文件编码>相同
推荐选<UFT-8>

5.QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
只与这个相关QString str = QString::fromLocal8Bit("中文");
以上2个最好都不用,用以下的

// 常规做法举例之GB2312  ,注意"UTF-16"的输入是要带BOM的
QTextCodec *pCodec = QTextCodec::codecForName("GB2312");// "UTF-8", "UTF-16"
GB2312转QString: pCodec->toUnicode();
QString转GB2312: pCodec->fromUnicode();

// 另外QString类分别针对"UTF-8", "UTF-16"做了专门的函数, 当然结果同常规做法是一样的,例子如下:

// Unicode(utf8)(3个字节/汉字, 1个字节/字母)
UTF-8转QString: QString::fromUtf8();
QString转UTF-8: QString.toUtf8();

// Unicode(utf16) Unicode(ucs2) Unicode(iso-10646-ucs-2)  2个字节/字符,也是windows记事本里那个Unicode
// qt中表示UTF-16要用ushot,不要用wchar_t(wchar_t大小根据编译器而定)
UTF-16转QString: QString::fromUtf16(); 这个带2个字节的BOM头; [0xFF 0xFE](61,00) [0xFE 0xFF](00,61)
QString转UTF-16:  QString.utf16(); 返回以0结尾的ushot数组 

6.
Qt Creator -> ui面板上控件直接设成中文内容
无相关,设成什么就是什么,因为QString本身是unicode
保存到<ui_***.h>文件文件时是这样写的
label->setText(QApplication::translate("Dialog", "\346\210\221\344\273\254", 0, QApplication::UnicodeUTF8));
或label->setText(QString::fromUtf8("\346\210\221\344\273\254"));


7.文本文件的编码

windows平台文本文件有BOM
        ANSI:没有文件头,2字节/汉字,1字节/英文
        UTF-8:文件头[0xEF,0xBB,0xBF],3字节/汉字,1字节/英文
        Unicode:文件头[0xFF,0xFE],2字节/汉字,2字节/英文
        Unicode big endian :文件头[0xFE,0xFF],同Unicode,字节序相反

Linux平台UTF-8和GB2312文件都没有BOM
Linux平台UTF-16同windows一样,有BOM且相同

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多