1

我的应用程序是用 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,这是意料之外的。

因此,我正在寻找有关文本重新编码的任何帮助或经验/示例。

此致,

4

1 回答 1

1

不要țţ. 前者是您帖子中的内容,后者是Windows-1250实际支持的内容。

您帖子中的字符 ț 是 T-comma, U+021B, LATIN SMALL LETTER T WITH COMMA BELOW,但是:

这个字母不是早期 Unicode 版本的一部分,这就是为什么 Ţ(T-cedilla,可从 1.1.0 版,1993 年 6 月获得)经常在罗马尼亚语的数字文本中使用。

提到的字符是 ţ,U+0163,带有 CEDILLA 的拉丁小写字母 T(强调我的):

在 Unicode 的早期版本中,罗马尼亚字母 Ț(T 逗号)被认为是 Ţ 的字形变体,因此没有出现在 Unicode 标准中。它也不存在于 Windows-1250(中欧)代码页中。

şș, 是S-cedillaS-comma的故事是类似的。

如果您必须编码到这个古老的 Windows 1250 代码页,我建议在编码之前用 cedilla 变体(小写和大写)替换逗号变体。我想罗马尼亚人会理解的:)

于 2020-06-08T14:04:13.210 回答