编码格式
- UCS-2:Unicode刚开始时,用恒定两个字节表示所有字符,只有65536个字符空间。
- UTF-16:Unicode字符超过65536时,参考【多字节编码】,将两字节扩展至四字节表示所有字符。
- UTF-8:便于网络传输和兼容ASCII码,按照规则组合1~4字节来表示字符。
- UTF-32/UCS-4:直接使用4字节编码所有字符。
Windows的历史
- Unicode不成熟时,Windows使用多字节编码来支持各种语言的。
- WinNT版本之后,Windows内核使用UTF-16来编码,但仍支持多字节编码。
- UTF-16的API以W结尾,多字节API以A结尾。
C++和Qt对字符串编码的区别
- C++中std::string使用gbk,使用中文没有问题。
- Qt为更好兼容国际化,使用了UTF-16作为编码格式。
- Qt中定义的中文字符串,会自动经历一次有【多字节编码】转换为UTF-16的过程。
Qt编码方法
- Qt 4.x默认多字节编码是Latin-1(西欧多字节编码);Qt 5.x默认编码是UTF-8。
- const char*隐式转换为QString,使用QTextCodec::codecForCStrings()。
- Qt的函数QObject::tr(),是将const char* 转换为QString,使用QTextCodec::codecForTr()。
- QTextCodec::codexForLocal()是指用当前系统所用编码,一般中文Windows是gbk,中文Linux是UTF-8。
Qt编码问题
- 使用codexForLocal()编码,在中文环境正常使用,非中文环境就会出现悲剧。
- 使用GBK编码的程序,容易有悲剧。
Qt正确编码的方式
- 设置默认编码方式
Qt支持中文输出
- 使用宏,支持中文字符
#pragma execution_character_set("utf-8")
-
或者使用QStringLiteral("xx")
#pragma execution_character_set("utf-8")
void fun()
{
QString s1="编码有什么难的-1";
qInfo()<<"s1= "<<s1;
}