QString是 Qt 编程中常用的一个类,用于存储和操作字符串。
问题描述
在学习中因为将Qt默认编码格式给改成了GBK格式,导致在程序再次使用中文时出现乱码。如果把编码格式改回UTF-8,又会导致之前写的注释变为乱码。
解决方法
官方手册的解释如下,大概的意思是说QString存储字符串采用的是Unicode码,每个字符是一个16位的QChar,而不是8位的char。因此,QString能够很好地处理中文字符,一个汉字在QString中算作是一个字符。对于超过65535的Unicode编码,QString则使用两个连续的QChar字符表示。
在构造函数中说用8位字符串str初始化的字符串。使用fromUtf8()函数将给定的const char指针转换为Unicode。所以可以理解为将char*传给QString,要确保编码格式为UTF-8,否则QString在转到Unicode时会出错。
到这里明白了出错原因,因为也是学习于是找找与UTF-8相关的,看到有QString::fromUtf8
,于是就以为成功了,但并没有解决该问题,于是继续翻看文档。
发现在我的代码中,"第%1行第%2列" 是一个普通的C++字符串字面量,它包含的是ASCII 字符和一些中文字符,可以理解为没有从UTF-8编码的字节数组开始,而是直接从字符串字面量开始,于是代码改为以下,成功解决乱码。
void Widget::oncursorPositionChanged()
{
// 获取光标位置
QTextCursor cursor = ui->textEdit->textCursor();
ui->lblPosition->setText(QString::fromLocal8Bit("第%1行第%2列").arg(cursor.blockNumber() + 1).arg(cursor.columnNumber() + 1));
}
下图是来自文心一言的对比:
催更!
哈哈哈,正在对线...