测试文本
共4个汉字,GBK编码,应该占用8字节。
期望转换成UTF-8编码,则转换后应该是12字节。
#include <QtCore/QCoreApplication>
#include <QtCore/QFile>
#include <QtCore/QTextStream>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QFile infile("in.txt");
if (!infile.open(QIODevice::ReadWrite | QIODevice::Text))
return -1;
QFile outfile("out.txt");
if (!outfile.open(QIODevice::WriteOnly | QIODevice::Text))
return -2;
QTextStream instream(&infile);
QTextStream outstream(&outfile);
outstream.setCodec("utf-8");
outstream << instream.readAll() << endl; // 为何没有endl就会乱码?转换失败?
a.exit(0);
return 0;
}
两个问题:
1. 注释处,为何必须得加一个endl才能成功?
2. 使用同一个QFile,以ReadWrite方式打开为何失败(以下是失败代码)?
#include <QtCore/QCoreApplication>
#include <QtCore/QFile>
#include <QtCore/QTextCodec>
#include <QtCore/QTextStream>
#include <QtCore/QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QFile file("in.txt");
if (!file.open(QIODevice::ReadWrite | QIODevice::Text))
return -1;
QTextStream stream(&file);
QString text = stream.readAll();
stream.setCodec("utf-8");
stream << text << endl;
qDebug() << stream.readAll();
return a.exec();
}
4 个解决方案
#1
Windows + Qt 4.7.4 一切正常……
#2
第二个注意读写前先 seek()。
#include <QtCore/QCoreApplication>
#include <QtCore/QFile>
#include <QtCore/QTextCodec>
#include <QtCore/QTextStream>
#include <QtCore/QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QFile file("in.txt");
if (!file.open(QIODevice::ReadWrite | QIODevice::Text))
return -1;
QTextStream stream(&file);
QString text = stream.readAll();
stream.seek(0);
stream.setCodec("utf-8");
stream << text;
stream.seek(0);
qDebug() << stream.readAll();
return 0;
}
#3
1. endl 是 iostream 的操纵子,不要和 Qt 的流混用。
2. 从可移植性考虑,最好还是在读入的时候也设置一下编码。
3. 第一段代码的问题可能是 QFile 比 QTextStream 先析构了,导致内容没有完全写入,可以自己手动关闭 stream 和 file 试试。
2. 从可移植性考虑,最好还是在读入的时候也设置一下编码。
3. 第一段代码的问题可能是 QFile 比 QTextStream 先析构了,导致内容没有完全写入,可以自己手动关闭 stream 和 file 试试。
#4
#include <QtCore/QCoreApplication>
#include <QtCore/QFile>
#include <QtCore/QTextCodec>
#include <QtCore/QTextStream>
#include <QtCore/QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QFile file("test.txt");
if (file.open(QIODevice::ReadWrite | QIODevice::Text))
{
QTextStream stream(&file);
const QString &text = stream.readAll();
stream.seek(0);
stream.setCodec(QTextCodec::codecForName("utf-8"));
stream.setGenerateByteOrderMark(true);
stream << text;
stream.seek(0);
qDebug() << stream.readAll();
}
return 0;
}
#1
Windows + Qt 4.7.4 一切正常……
#2
第二个注意读写前先 seek()。
#include <QtCore/QCoreApplication>
#include <QtCore/QFile>
#include <QtCore/QTextCodec>
#include <QtCore/QTextStream>
#include <QtCore/QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QFile file("in.txt");
if (!file.open(QIODevice::ReadWrite | QIODevice::Text))
return -1;
QTextStream stream(&file);
QString text = stream.readAll();
stream.seek(0);
stream.setCodec("utf-8");
stream << text;
stream.seek(0);
qDebug() << stream.readAll();
return 0;
}
#3
1. endl 是 iostream 的操纵子,不要和 Qt 的流混用。
2. 从可移植性考虑,最好还是在读入的时候也设置一下编码。
3. 第一段代码的问题可能是 QFile 比 QTextStream 先析构了,导致内容没有完全写入,可以自己手动关闭 stream 和 file 试试。
2. 从可移植性考虑,最好还是在读入的时候也设置一下编码。
3. 第一段代码的问题可能是 QFile 比 QTextStream 先析构了,导致内容没有完全写入,可以自己手动关闭 stream 和 file 试试。
#4
#include <QtCore/QCoreApplication>
#include <QtCore/QFile>
#include <QtCore/QTextCodec>
#include <QtCore/QTextStream>
#include <QtCore/QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QFile file("test.txt");
if (file.open(QIODevice::ReadWrite | QIODevice::Text))
{
QTextStream stream(&file);
const QString &text = stream.readAll();
stream.seek(0);
stream.setCodec(QTextCodec::codecForName("utf-8"));
stream.setGenerateByteOrderMark(true);
stream << text;
stream.seek(0);
qDebug() << stream.readAll();
}
return 0;
}