多字节字符集和宽字符(Unicode)字符集的区别
- char叫多字节字符,一个char占一个字节,之所以叫多字节字符是因为它表示一个字符时可能是一个字节也可能是多个字节。例如英文字母"s"用一个char(一个字节表示),中文字符“中”则用两个char(两个字节表示)。
- wchar_t被称为宽字符,一个wchar_t占两个字节,不管是一个英文字母还是一个中文字符,用常量给wchar_t赋值时,需要在常量前面加L。
Unicode与UTF-8的区别
- Unicode是一种字符集,而该字符集有多种编码方式,如:UTF-8、UTF-16、UTF-32
- UTF-8采用1-6字节的变长编码方式编码Unicode。英文使用一个字节,中文使用三个字节。
- Window采用UTF-16编码方式,Mac OS、Linux采用UTF-8编码方式。
- GB2312字符集:收入6763个汉字和682个非汉字图形字符。而在编码上,采用基于区位码的一种编码方式,采用2个字节表示一个中文字符。
- BIG5字符集:常用于繁体中文,共收入13060个中文字,也采用2字节的方式表示繁体中文。在中国台湾、香港、澳门等地区广泛使用。
- 由此可见,不同的编码方式对于相同的二进制字符串的解释是不同的。
Qt中UTF-8和GBK之间的编码转换
Qt中UTF-8和GBK之间的编码转换
//原始UTF8数据
QString strOrgData(m_szIDData);
QTextCodec *utf8 = QTextCodec::codecForName("UTF-8");
QTextCodec::setCodecForLocale(utf8);
1.UTF8 ---> GBK
//UTF8转unicode
QString strUnicode= utf8->toUnicode(strOrgData.toLocal8Bit().data());
//Unicode转GBK
QTextCodec *gbk = QTextCodec::codecForName("gbk");
QByteArray gbkdata = gbk->fromUnicode(strUnicode);
2.GBK ---->UTF8
//GBK转unicode
strUnicode = gbk->toUnicode(gbkdata.data());
//unicode转UFT8
QByteArray utf8data = utf8->fromUnicode(strUnicode);
关于VS配置项“使用多字节字符集”和“使用Unicode字符集”的区别
1.直接区别就是编译器是否增加了宏定义 --UNICODE,当选在使用Unicode字符集时,编译器会增加宏定义–UNICODE,这会影响部分Windows API接口。例如: 调用函数MessageBox,实际使用的是MessageBoxW,MessageBoxW关于字符串的入参类型是LPCWSTR,使用MessageBox时,字符串前需加L。