0

下面的函数是我在我正在处理的 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总是得到我的测试文本文件。但是,无论标志如何,编码仍然是UTF-8 。utf8

file使用实际数据(由客户端提供)调用CSV 文件返回

../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

这仍然不是我想要的。

4

1 回答 1

0

通常这就是我所做的:

QTextCodec *codec1 = QTextCodec::codecForName("ISO 8859-15");
QByteArray csvStreambyteArray = " .... "; // from your file
QString csvStreamString = codec1->toUnicode(csvStreambyteArray);
csvStream << csvStreamString ;
于 2018-01-31T15:35:45.120 回答