【问题标题】:Qt5 C++ UTF-8 convertion to Windows-1250 of Romanian ș and ț charactersQt5 C++ UTF-8 转换为 Windows-1250 罗马尼亚语 ș 和 ț 字符
【发布时间】: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 to setCodec directly
  • 嗨@Thomas。不,codecForName 不返回 nullptr 并且其他罗马尼亚字符被正确转换......只有 'ș' 和 'ț' 表现出这种奇怪的行为。我试图将一个字符串传递给 setCodec 方法并且行为是相同的
  • 0xFE 在 Windows-1250 中是“t with cedilla”,U+0163。你有 U+021B, "t with comma below"。它在代码页 1250 中无法表示,因此转换会产生问号 0x3F。

标签: c++11 utf-8 qt5 cp1250


【解决方案1】:

不要将țţ 混淆。前者是你的帖子,后者是Windows-1250实际支持的。

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

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

提到的字符是ţ,U+0163,LATIN SMALL LETTER T WITH CEDILLA(强调我的):

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

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

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

【讨论】:

  • 感谢您的帮助,我会检查适当的字母以供翻译数据的人使用。
猜你喜欢
  • 1970-01-01
  • 2011-05-15
  • 1970-01-01
  • 2015-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-23
  • 1970-01-01
相关资源
最近更新 更多