我最近想了解qt如何对文件进行编码和解码。我测试了一些例子,但有些让我感到困惑。
这是我的密码:
#include <QApplication>
#include <QFile>
#include <QTextStream>
#define TEST(testFile) void test##testFile()
TEST(ANSI)
{
QFile inFile(":/test/test-ANSI.txt");
if (!inFile.open(QIODevice::ReadOnly | QIODevice::Text))
return;
QFile outFile("../test-ANSI-bak.txt");
if (!outFile.open(QIODevice::WriteOnly | QIODevice::Truncate))
return;
QTextStream in(&inFile);
QTextStream out(&outFile);
out.setCodec("UTF-8");
// 这样写入会去掉换行符号
while (!in.atEnd()) {
QString line = in.readLine();
out << line;
}
}
TEST(GB2312)
{
QFile inFile(":/test/test-GB2312.txt");
if (!inFile.open(QIODevice::ReadOnly | QIODevice::Text))
return;
QFile outFile("../test-GB2312-bak.txt");
if (!outFile.open(QIODevice::WriteOnly | QIODevice::Truncate))
return;
QTextStream in(&inFile);
QTextStream out(&outFile);
out.setCodec("UTF-8");
while (!in.atEnd()) {
QString line = in.readLine();
out << line;
}
}
TEST(utf8BOM)
{
QFile inFile(":/test/test-utf8-BOM.txt");
if (!inFile.open(QIODevice::ReadOnly | QIODevice::Text))
return;
QFile outFile("../test-utf8-BOM-bak.txt");
if (!outFile.open(QIODevice::WriteOnly | QIODevice::Truncate))
return;
QTextStream in(&inFile);
QTextStream out(&outFile);
out.setCodec("UTF-8");
while (!in.atEnd()) {
QString line = in.readLine();
out << line;
}
}
TEST(utf8)
{
QFile inFile(":/test/test-utf8.txt");
if (!inFile.open(QIODevice::ReadOnly | QIODevice::Text))
return;
QFile outFile("../test-utf8-bak.txt");
if (!outFile.open(QIODevice::WriteOnly | QIODevice::Truncate))
return;
QTextStream in(&inFile);
QTextStream out(&outFile);
out.setCodec("UTF-8");
while (!in.atEnd()) {
QString line = in.readLine();
out << line;
}
}
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
testANSI();
testGB2312();
testutf8BOM();
testutf8();
return app.exec();
}我输入的文本内容如下:
----
I love you!
我爱你!
。。。
1234
1234对于ANSI,GB2312,utf8-BOM,我得到输出文件例如: test-ANSI-bak.txt
----I love you!我爱你!。。。12341234对于utf8,我得到输出文件例如: test-utf8-bak.txt
----I love you!鎴戠埍浣狅紒銆傘€傘€12341234为什么test-utf8-bak.txt会显示混乱的代码?我真搞不懂!
发布于 2018-04-04 07:02:29
QTextStream是根据输入文件内容猜测编解码器,对于非BOM utf-8文件它猜错了。
如果知道输入文件的格式,则应该调用in.setCodec();如果不知道输入文件的格式,则必须继续依赖Qt的猜测或编写自己的编码检测器。
它看起来像QTextStream只查找BOM,不做任何其他的Unicode检测,从http://doc.qt.io/qt-5/qtextstream.html
还支持自动Unicode检测。当启用此功能(默认行为)时,QTextStream将检测UTF-16或UTF-32 BOM (字节顺序标记),并在读取时切换到适当的UTF编解码器。
https://stackoverflow.com/questions/49644540
复制相似问题