QString 使用的是 UTF-16
1、就像 std::string 做的一样, QString 可以在必要的时候由 const char* 隐 式 或 显 式 转 换 而 成 。 这 个 过 程 中 使 用 的 编 码 , 就 是 QTextCodec::codecForCStrings 。
2、Qt 有一个函数, QObject::tr ,也可以将 const char* 转换为 QString 。 这个过程中使用的编码方式由 QTextCodec::codecForTr 指定。
3、另外 QTextCodec::codecForLocale 表明当前系统所用编码。一般中文 Windows 应该是 GBK 。中文 Linux 则一般为 UTF-8 。
解决乱码办法:
QTextCodec::setCodecForTr(QTextCodec::codecForName("utf-8")); QTextCodec::setCodecForCStrings(QTextCodec::codecForName("utf-8")); 将 QObject::tr 和 const char* 的编码都改成 UTF-8 ,并 且使用 UTF-8 保存文件。这样就可以保证在任何语言的 操作系统上面都可以显示正确的中文。 但是要特别注意的是,修改 codecForLocale 要慎重! 在 Qt 里面, codecForLocale 的作用主要有两个,一个 是与外部文件读写的时候使用的默认编码,一个是向命 令行输出信息( qDebug )使用的编码。
例如:
4、除了 const char* 的隐式转换和 QObject::tr 的转换之外, Qt 事实上有更一般的字符编码转换方式。
// 我们的源文件是 UTF-8 格式的,因此建立一个 QString 。
QString s = QString::fromUtf8(" 这是 UTF-8 的字符串 ");
// 将 QString 转换为 GBK 格式的 QByteArray 字符数组。
// QByteArray::data() 可以拿到 const char* 。
QByteArray gbk_s = QTextCodec::codecForName("gbk")->fromUnicode(s);
// 然后再从 GBK 字符数组转换回 QString 。
QString s2 = QTextCodec::codecForName("gbk")->toUnicode(gbk_s);
有关文件 IO 的编码处理、
5、事实上 Qt 读取文件可以用任何一种编码,只是默认以 codecForLocale 而已。
使用 QTextStream 可以通过文本方式读取 QFile ,而 QTextStream 则可以设定使用的编码方式。
就算文件名有中文也不怕。只要正确转换为 QString ,剩 下的就交给 Qt 吧!
QFile file(QString::fromUtf8(" 中文名 .txt"));
if (file.open(QIODevice::ReadOnly))
{
QTextStream fin(&file);
fin.setCodec(QTextCodec::codecForName("utf-8"));
fin.readLine();
}