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