为什么我在有关文件编码格式的QT代码中获得了混乱的代码
why I got the messy code result in my qt code about file encoding format?
我最近想学习如何编码和解码文件。我测试了一些例子,但有些让我感到困惑。
这是我的代码:
#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显示凌乱的代码?我感到困惑!
QTextStream
正在基于输入文件内容猜测编解码器,对于非BOM UTF-8文件,它猜测错误地猜测。
如果您知道输入文件的格式,则应致电in.setCodec()
,如果您不知道格式,则必须继续依靠QT的猜测或编写自己的编码检测器。
看起来QTextStream只在寻找BOMS,并且不会从http://doc.qt.io/qt-5/qtextstream.html进行任何其他Unicode检测。
也支持自动Unicode检测。当启用此功能(默认行为(时,QTEXTStream将检测UTF-16或UTF-32 BOM(字节订单标记(,然后在阅读时切换到适当的UTF编解码器。
相关文章:
- Qt Quick-如何仅从c++代码与qml属性交互
- 我无法在 qt 的C++代码中定义字符串
- 需要将一行代码从C++ Qt翻译成PyQt
- 在Qt/C++中从一个代码构建两个略有不同的项目
- 将 Qt 代码从 createTextureFromId 更新为 createTextureFromNativeObje
- Qt:更新 QString 时自动生成的代码失败
- Qt GUI使用Qfiledialogbox和qlabel显示视频,这是我的代码
- 尝试在 QT 项目中调用 Java 代码时未找到类异常
- 运行Qt时处理退出代码0xC0000135 hello world
- 使用Qt Creator在调试模式下编译一段代码
- qt C++命令行代码中的分段错误(核心转储)
- 无法在这个基本的Qt代码片段中找到错误,但我被告知它肯定存在?
- 将Qt Designer项目转换为C++代码
- 如何从Qt QWebEngineView获取HTTP状态代码
- Qt创建者-如何删除Clang代码模型
- 使用其他编译器编译QT代码
- macOS+Qt+Intellisense上的Visual Studio代码
- 如何以及在何处使用带QT的Basler Cam实现opencv人脸检测代码
- 如果代码中没有连接任何插槽,是否有理由发出Qt信号?
- QT:AES-256-CBC 根据 PHP 代码在C++中加密/解密