【问题标题】:How to detect the equivalent Windows code pages for UTF8 text如何检测 UTF8 文本的等效 Windows 代码页
【发布时间】:2015-07-30 19:00:40
【问题描述】:

我有一个在 Windows XP 上运行的打印/邮件系统,它不支持在邮件列表中使用 UTF8。我想将邮件列表的代码页转换为适当的 Windows 本机等效项。但据我了解,这不是一种适合所有人的尺寸,并且根据语言环境,代码页会有所不同,例如匈牙利、希腊、瑞典、德国、俄罗斯等等。更不用说繁体中文等等了。

有没有一种方法可以检测,比如对于一个不应该需要多个代码页的记录,适当的 Windows 代码页是什么?

【问题讨论】:

  • 你不能随便选择一个代码页,你运行的 Windows 版本会有一个它使用的代码页。尝试使用任何其他代码页都不太可能奏效。
  • 你说得对,操作系统有一个设置的代码页。这个想法是让它与en.wikipedia.org/wiki/AppLocale 和给定的代码页一起工作。如果只需要在几天内完成 10 次,这将是可行的。

标签: windows utf-8 character-encoding codepages


【解决方案1】:

我能想到的最简单的想法:

对于所有支持的代码页列表中的每个代码页 X:

  1. 取原始Unicode文本

  2. 将其转换为代码页 X。

  3. 将其转换回来。

  4. 检查是否有任何变化。

  5. 如果没有,恭喜,这是要使用的代码页。

我相信这个解决方案可能存在一些小问题(一些罕见的字符可能不是往返但看起来相同),但在大多数情况下应该没问题。

此外,很容易偶然发现不适合一种传统编码的文本,因此您需要为此做好准备。您可以选择与原版差异最小的。

【讨论】:

    【解决方案2】:

    一种可能的解决方案是使用诸如iconv 之类的转换工具来尝试转换为许多不同的字符集,然后查看哪个成功且没有错误。手册页中提到的“-c”选项似乎暗示如果转换不能成功,默认行为是退出并出现错误。 (我之前使用过 iconv 并且效果很好,但它几乎总是从旧字符集转换为 UTF-8,而不是相反;)使用这种方法,您只需尝试预定义的字符集列表并查看哪一个成功了。

    概念证明(Mac OS 10.10.3):

    $ iconv --version
    iconv (GNU libiconv 1.11)
    
    $ if echo '☃' | iconv -f UTF-8 -t ISO-8859-1; then echo 'It worked'; else echo 'Did not work'; fi
    iconv: (stdin):1:0: cannot convert
    Did not work
    
    $ if echo 'é' | iconv -f UTF-8 -t ISO-8859-1 > /tmp/out.txt; then echo 'It worked'; else echo 'Did not work'; fi; hexdump -C /tmp/out.txt
    It worked
    00000000  e9 0a                                             |..|
    00000002
    

    (并且字节值 E9 是正确的:https://en.wikipedia.org/wiki/ISO/IEC_8859-1

    【讨论】:

    • 看起来不同的行为是乱码它无法处理的文本。我不确定从编码到编码是否一致。我可能仍然需要采用@karol-s 提到的完整往返想法
    • 可能是不同版本的 iconv 或其他错误?请参阅编辑后的答案(添加示例) - 绝对适合我。
    • 这个方法确实有效。我正在使用它并且还对 utf8 和 diff 进行反向 iconv 和原始结果是相同的 - 尽管几个窗口编码都在同一个样本上成功。我需要做一些更广泛的测试来建立一个积极的过程,但该方法似乎已经足够了,并且有望避免需要光栅和比较位图。
    【解决方案3】:

    电子邮件支持 base64 编码文本 (http://www.w3.org/Protocols/rfc1341/5_Content-Transfer-Encoding.html):

    Content-Type: text/html;
        charset="UTF-8"
    Content-Transfer-Encoding: base64
    
    SSBoYXZlIGEgcHJpbnRpbmcvbWFpbGluZyBzeXN0ZW0=
    

    所以你可以尝试将utf8文本转成字节,然后再转成base64。

    【讨论】:

      猜你喜欢
      • 2010-09-10
      • 1970-01-01
      • 1970-01-01
      • 2012-09-04
      • 2014-07-08
      • 1970-01-01
      • 2011-05-01
      • 2015-09-09
      相关资源
      最近更新 更多