【发布时间】:2020-06-08 13:32:58
【问题描述】:
我的应用程序是用 C++'11 开发的,使用 Qt5。在此应用程序中,我需要将 UTF-8 文本存储为 Windows-1250 编码文件。 我尝试了以下两种方法,并且都适用于罗马尼亚语 'ș' 和 'ț' 字符:(
-
1.
auto data = QStringList() << ... <some texts here>;
QTextStream outStream(&destFile);
outStream.setCodec(QTextCodec::codecForName("Windows-1250"));
foreach (auto qstr, data)
{
outStream << qstr << EOL_CODE;
}
-
2.
auto data = QStringList() << ... <some texts here>;
auto *codec = QTextCodec::codecForName("Windows-1250");
foreach (auto qstr, data)
{
const QByteArray encodedString = codec->fromUnicode(qstr);
destFile.write(encodedString);
}
如果是 'ț' 字符(别名 0xC89B),而不是预期的 0xFE 值,该字符被编码并存储为 0x3F,这是意料之外的。
所以我正在寻找有关文本重新编码的任何帮助或经验/示例。
最好的问候,
【问题讨论】:
-
您是否检查过
codecForName没有返回 0?对了,你也可以pass a string tosetCodecdirectly。 -
嗨@Thomas。不,codecForName 不返回 nullptr 并且其他罗马尼亚字符被正确转换......只有 'ș' 和 'ț' 表现出这种奇怪的行为。我试图将一个字符串传递给 setCodec 方法并且行为是相同的
-
0xFE 在 Windows-1250 中是“t with cedilla”,U+0163。你有 U+021B, "t with comma below"。它在代码页 1250 中无法表示,因此转换会产生问号 0x3F。