如何使用 QTextStream 在 Linux 上创建 ISO 8859-15(而不是默认的 UTF-8)编码文本文件?
How to create an ISO 8859-15 (instead of default UTF-8) encoded text file on Linux using QTextStream?
下面的函数是我在我正在处理的 Qt 项目的单元测试中创建的。
它创建一个文件(空的或填充的),然后在各种用例中打开、处理和评估结果。我确定的一个特殊用例是编码实际上会影响我的应用程序,因此我决定也涵盖非 UTF-8 文件(尽可能)。
void TestCsvParserOperators::createCsvFile(QString& path, CsvType type, bool utf8)
{
path = "test_data.txt";
QFile csv(path);
// Make sure both reading and writing access is possible. Also turn on truncation to replace any existing files
QVERIFY(csv.open(QIODevice::ReadWrite | QIODevice::Truncate | QIODevice::Text) == true);
QTextStream csvStream(&csv);
// Set encoding
if (utf8)
{
csvStream.setCodec("UTF-8");
}
else
{
csvStream.setCodec("ISO 8859-15");
csvStream.setGenerateByteOrderMark(false);
}
switch(type)
{
case EMPTY: // File doesn't contain any data
break;
case INVALID: // File contains data that is not supported
csvStream << "abc" << '\n';
break;
case VALID:
{
// ...
break;
}
}
csv.close();
}
虽然项目在 Linux 上运行,但数据在 上导出为 纯文本文件 Windows(并可能使用 记事本 编辑)并由我的应用程序按原样使用。我发现它的编码不是 UTF-8,而是 ISO 8859-15。这导致了一堆问题,包括错误处理的字符等。
我的应用程序中实际测试的部分是
// ...
QTextStream in(&csvFile);
if (in.codec() != QTextCodec::codecForName("UTF-8"))
{
LOG(WARNING) << this->sTag << "Expecting CSV file with UTF-8 encoding. Found " << QString(in.codec()->name()) << ". Will attempt to convert to supported encoding";
// Handle encoding
// ...
}
// ...
无论 type
和 utf8
的值组合如何,我总是得到我的测试文本文件。然而,无论 utf8
标志如何,编码仍然是 UTF-8。
正在使用实际数据(由客户提供)调用 file
CSV 文件returns
../trunk/resources/data.txt: ISO-8859 text, with CRLF line terminators
在 test_data.txt
上做同样的事情给了我
../../build/test-bin/test_data.txt: UTF-8 Unicode text
我在某处读到,如果我想使用 UTF-8 以外的编码,我必须使用 QByteArray
。但是我无法在 Qt 文档中验证这一点。我还读过设置 BOM
应该可以解决问题,但我尝试启用和禁用它的生成但没有任何运气。
我已经编写了一个 bash 小脚本,可以将编码转换为 UTF-8(假定输入文件是 ISO 8859),但我想
- 已将此集成到我的实际应用程序中
- 不会每次都被迫处理这个问题
- 至少对客户端使用的编码进行一些基本的测试覆盖
有什么实现方法吗?
更新: 我将写入文本文件的内容替换为
csvStream << QString("...").toLatin1() << ...;
现在我得到了
../../build/test-bin/test_data.txt: ASCII text
这仍然不是我要找的。
通常我是这样做的:
QTextCodec *codec1 = QTextCodec::codecForName("ISO 8859-15");
QByteArray csvStreambyteArray = " .... "; // from your file
QString csvStreamString = codec1->toUnicode(csvStreambyteArray);
csvStream << csvStreamString ;
下面的函数是我在我正在处理的 Qt 项目的单元测试中创建的。
它创建一个文件(空的或填充的),然后在各种用例中打开、处理和评估结果。我确定的一个特殊用例是编码实际上会影响我的应用程序,因此我决定也涵盖非 UTF-8 文件(尽可能)。
void TestCsvParserOperators::createCsvFile(QString& path, CsvType type, bool utf8)
{
path = "test_data.txt";
QFile csv(path);
// Make sure both reading and writing access is possible. Also turn on truncation to replace any existing files
QVERIFY(csv.open(QIODevice::ReadWrite | QIODevice::Truncate | QIODevice::Text) == true);
QTextStream csvStream(&csv);
// Set encoding
if (utf8)
{
csvStream.setCodec("UTF-8");
}
else
{
csvStream.setCodec("ISO 8859-15");
csvStream.setGenerateByteOrderMark(false);
}
switch(type)
{
case EMPTY: // File doesn't contain any data
break;
case INVALID: // File contains data that is not supported
csvStream << "abc" << '\n';
break;
case VALID:
{
// ...
break;
}
}
csv.close();
}
虽然项目在 Linux 上运行,但数据在 上导出为 纯文本文件 Windows(并可能使用 记事本 编辑)并由我的应用程序按原样使用。我发现它的编码不是 UTF-8,而是 ISO 8859-15。这导致了一堆问题,包括错误处理的字符等。
我的应用程序中实际测试的部分是
// ...
QTextStream in(&csvFile);
if (in.codec() != QTextCodec::codecForName("UTF-8"))
{
LOG(WARNING) << this->sTag << "Expecting CSV file with UTF-8 encoding. Found " << QString(in.codec()->name()) << ". Will attempt to convert to supported encoding";
// Handle encoding
// ...
}
// ...
无论 type
和 utf8
的值组合如何,我总是得到我的测试文本文件。然而,无论 utf8
标志如何,编码仍然是 UTF-8。
正在使用实际数据(由客户提供)调用 file
CSV 文件returns
../trunk/resources/data.txt: ISO-8859 text, with CRLF line terminators
在 test_data.txt
上做同样的事情给了我
../../build/test-bin/test_data.txt: UTF-8 Unicode text
我在某处读到,如果我想使用 UTF-8 以外的编码,我必须使用 QByteArray
。但是我无法在 Qt 文档中验证这一点。我还读过设置 BOM
应该可以解决问题,但我尝试启用和禁用它的生成但没有任何运气。
我已经编写了一个 bash 小脚本,可以将编码转换为 UTF-8(假定输入文件是 ISO 8859),但我想
- 已将此集成到我的实际应用程序中
- 不会每次都被迫处理这个问题
- 至少对客户端使用的编码进行一些基本的测试覆盖
有什么实现方法吗?
更新: 我将写入文本文件的内容替换为
csvStream << QString("...").toLatin1() << ...;
现在我得到了
../../build/test-bin/test_data.txt: ASCII text
这仍然不是我要找的。
通常我是这样做的:
QTextCodec *codec1 = QTextCodec::codecForName("ISO 8859-15");
QByteArray csvStreambyteArray = " .... "; // from your file
QString csvStreamString = codec1->toUnicode(csvStreambyteArray);
csvStream << csvStreamString ;