1.Qt字符编码转换(UTF-8转换为GBK)
字符串编码格式转换
很多时候可能需要字符串编码的转换,最近我需要获取⼀段字符串的长度,我strlen() 获取的’你好’ 的字节长度为6 ,我记得每个汉字占⽤2字节,查了⼀下 UTF-8格式汉字(含繁体)占3字节,需要转下码.
编码知识
Qt常见的两种编码是:UTF-8和GBK
UTF-8:Unicode 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的扩展,除了兼容GB
2312外,它还能显⽰繁体中⽂,还有⽇⽂的假名。
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
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->Local8Bit().data()); //2. unicode -> gbk, 得到QByteArray
QByteArray gb_bytes= gbk->fromUnicode(strUnicode);
//gbk -> utf8
//1. gbk to unicode
strUnicode=gbk->Local8Bit().data());
/
/2. unicode -> utf-8
QByteArray utf8_bytes=utf8->fromUnicode(strUnicode);
unicode字符转中文格式转换为 gbk 以后汉字就是2字节了,搞定

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。