如何使用 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
    // ...
}

// ...

无论 typeutf8 的值组合如何,我总是得到我的测试文本文件。然而,无论 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 ;