聊聊字符编码那些事
由于时间有限,文本会持续更新中…
资料参考链接如下:
字符编码的历史演变
计算机字符编码的历史
Windows操作系统的字符编码集
在WIndows操作系统下可以通过命令行模式查看系统使用的字符集,如下图所示:
从图中看到,活动页代码为936,代表GB2312(简体中文)。作者的个人计算机安装的是Windows10简体中文版。
VS IDE
Microsoft Visual Studio集成开发环境采用的字符编码是操作系统使用的字符编码。
Qt Creator IDE
Qt Creator集成开发环境的字符编码,可以设置,如下图所示。作者的Qt Creator版本为4.2.0(Community)
这里需要注意,选择文件编码后重启Qt Creator设置才能生效。
QString
QString使用的是Unicode编码,在不通过QTextCodec类设置QString的编码方式下,QString的构造函数默认调用fromLatin1函数将字符串转为Unicode编码(即QString认为字符串采用的是Latin1编码)。在这种情况下输入中文就会显示乱码,因为Latin1编码无法解释中文,更不用说转换为Unicode编码后正确显示中文了。有以下两种方法可以避免中文显示乱码的方法。
1. 局部编码
// GB2312转Unicode 局部编码
// 方法A
QByteArray gbk2312String = "中文"; // 文件的编码方式为GB2312,所以“中文”这两个字的编码方式为GB2312
QTextCodec *codec = QTextCodec::codecForName("GBK"); // 函数输入参数GBK,代表了三种中文编码方式,即GB2312/GBK/GB18080
QString strUnicode = codec->toUnicode(gbk2312String);
// 方法B QString的静态函数fromLocal8Bit()执行的编码转换依赖于QTextCodec类的codecForLocale()函数。如果本地操作系统是GB2312,则fromLocal8Bit()负责将GB2312转换为Unicode编码。注意!如果此时文件编码与操作编码不同,则中文还是会显示乱码!所以,文件编码决定了采用何种编码转换为Unicode编码
QString strUnicode = QString::fromLocal8Bit("中文");
ui->label->setText(strUnicode);
2. 整体编码
// GB2312转Unicode 整体编码
// 方法A
QTextCodec *codec = QTextCodec::codecForLocale();
QTextCodec::setCodecForCStrings(codec); // 通过调用该函数,使得QString在调用构造函数时将本地操作系统编码转换为Unicode编码。注意!如果此时文件编码与操作系统的编码不同,则中文还是会显示乱码!
// 方法B
QTextCodec *codec = QTextCodec::codecForName("GBK");
QTextCodec::setCodecForCStrings(codec);
QString strUnicode = "中文";