Qt 字符编码转换(UTF-8 转换为 GBK)

字符串编码格式转换

很多时候可能需要字符串编码的转换,最近我需要获取一段字符串的长度,我strlen() 获取的’你好’ 的字节长度为6 ,我记得每个汉字占用2字节 ,查了一下 UTF-8格式 汉字(含繁体)占3字节,需要转下码.

编码知识

Qt常见的两种编码是:UTF-8和GBK
UTF-8Unicode TransformationFormat-8bit,允许含BOM,但通常不含BOM。是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为(三个字节)来编码。UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强。UTF-8编码的文字可以在各国支持UTF8字符集的浏览器上显示。如,如果是UTF8编码,则在外国人的英文IE上也能显示中文,他们无需下载IE的中文语言支持包。

GBK是国家标准GB2312基础上扩容后兼容GB2312的标准。GBK的文字编码是用双字节来表示的,即不论中、英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成1。GBK包含全部中文字符,是国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBD大。GBK是GB2312的扩展,除了兼容GB2312外,它还能显示繁体中文,还有日文的假名。

GBK、GB2312等与UTF8之间都必须通过Unicode编码才能相互转换:
GBK、GB2312--Unicode--UTF8
UTF8--Unicode--GBK、GB2312 
在简体中文windows系统下,ANSI编码代表GBK/GB2312编码,ANSI通常使用0x80~0xFF范围的2个字节来表示1个中文字符。0x00~0x7F之间的字符,依旧是1个字节代表1个字符。Unicode(UTF-16)编码则所有字符都用2个字节表示。

上面说了 GBK、GB2312等与UTF8之间都必须通过Unicode编码才能相互转换 但是我试了下 utf-8 可以直接转换为 gbk

Qt中 提供了 一个字符串转码的类 QTextCodec

The QTextCodec class provides conversions between text encodings.
Qt uses Unicode to store, draw and manipulate strings. In many situations you may wish to deal with data that uses a different encoding. For example, most Japanese documents are still stored in Shift-JIS or ISO 2022-JP, while Russian users often have their documents in KOI8-R or Windows-1251.
Qt provides a set of QTextCodec classes to help with converting non-Unicode formats to and from Unicode. You can also create your own codec classes.
The supported encodings are:
Big5
Big5-HKSCS
CP949
EUC-JP
EUC-KR
GB18030
HP-ROMAN8
IBM 850
IBM 866
IBM 874
ISO 2022-JP
ISO 8859-1 to 10
ISO 8859-13 to 16
Iscii-Bng, Dev, Gjr, Knd, Mlm, Ori, Pnj, Tlg, and Tml
KOI8-R
KOI8-U
Macintosh
Shift-JIS
TIS-620
TSCII
UTF-8
UTF-16
UTF-16BE
UTF-16LE
UTF-32
UTF-32BE
UTF-32LE
Windows-1250 to 1258
译文:
QTextCodec类提供文本编码之间的转换。
Qt使用Unicode存储、绘制和操作字符串。在许多情况下,您可能希望处理使用不同编码的数据。例如,大多数日本文档仍然存储在Shift-JIS或ISO 2022-JP格式,而俄罗斯用户的文档通常存储在KOI8-R或windows 1251格式。
Qt提供了一组QTextCodec类,以帮助将非Unicode格式转换为Unicode格式。您还可以创建自己的编解码器类。
支持的编码是:
Big5
Big5-HKSCS
CP949
EUC-JP
EUC-KR
GB18030
HP-ROMAN8
IBM 850
IBM 866
IBM 874
ISO 2022-JP
ISO 8859-1 to 10
ISO 8859-13 to 16
Iscii-Bng, Dev, Gjr, Knd, Mlm, Ori, Pnj, Tlg, and Tml
KOI8-R
KOI8-U
Macintosh
Shift-JIS
TIS-620
TSCII
UTF-8
UTF-16
UTF-16BE
UTF-16LE
UTF-32
UTF-32BE
UTF-32LE
Windows-1250 to 1258

我用到的就很简单 utf-8 转为 gbk
如果你原本编码不是 utf-8 就要先转换 utf-8 这里我们假设 原本编码也不是utf-8

#include <QTextCodec>

    QTextCodec *utf8 = QTextCodec::codecForName("UTF-8");  

    QTextCodec::setCodecForLocale(utf8);

    QTextCodec* gbk = QTextCodec::codecForName("gbk");

    QString str1="您好";

    //utf8 -> gbk

    //1. utf8 -> unicode

    QString strUnicode= utf8->toUnicode(str1.toLocal8Bit().data());

    //2. unicode -> gbk, 得到QByteArray

    QByteArray gb_bytes= gbk->fromUnicode(strUnicode);


    //gbk -> utf8

    //1. gbk to unicode
    strUnicode=gbk->toUnicode(str1.toLocal8Bit().data());
    //2. unicode -> utf-8
    QByteArray utf8_bytes=utf8->fromUnicode(strUnicode);

格式转换为 gbk 以后 汉字就是2字节了,搞定

        -来自98年菜鸡一枚,请大佬们多多关照!

猜你喜欢

转载自blog.csdn.net/weixin_42837024/article/details/81630720