QT 解决乱码实例

 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 )使用的编码。

例如:

QT 解决乱码实例

 

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();

}

上一篇:扒光Session的那些小秘密


下一篇:QT录波分析软件