1.明确一点window本地默认是GBK编码,GBK编码有以下两个特征:
- ASCII 字符与 UTF-8 相同,但 GBK 的中文字符范围是 0xB0A1 到 0xF7FE。
- GBK 中的中文字符通常是两个字节的组合
2.Qt 默认是utf-8编码,utf-8编码的特征是:
- 1 字节的字符(ASCII)以
0xxxxxxx形式表示。 - 2 字节的字符以
110xxxxx 10xxxxxx形式表示。 - 3 字节的字符以
1110xxxx 10xxxxxx 10xxxxxx形式表示。 - 4 字节的字符以
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx形式表示。
3 .window下调试器默认是utf-8编码。
4.以上三种情况组合可以出现各种编码错误情况,比如有些文件保存是GBk编码。导致使用Qstring::fromutf8()这个函数,运行乱码。这时候需要使用fromLocal8Bit()来使用本地的GBK编码读取字符串。或者使用QTextCodec来指定GBK编码格式读取。
5.有时候想要一串代码可以应付不同环境,可以先判断字符串是什么编码在采取不同的编码读取。下面是以最常用的GBK和UFT-8为例。
bool isValidGBK(const char* str) {
unsigned char ch;
while ((ch = *str++)) {
if (ch >= 0x80) { // 如果是高位字节
if (ch < 0xB0 || ch > 0xF7) {
return false; // 不在 GBK 中文字符范围内
}
if (*str == 0) return false; // 确保有后续字节
str++; // 跳过第二个字节
}
}
return true;
}
int main() {
std::string mixedStr = "Hello, 你好"; // 示例字符串
bool isgbk = isValidGBK(mixedStr);
QString encoding ;
if(isgbk) encoding = QString::fromLocal8Bit(mixedStr);
else encoding = QString(mixedStr);
qDebug() << encoding;
return 0;
}
1143

被折叠的 条评论
为什么被折叠?



