【问题标题】:How to normalize text content to UTF 8 in java如何在java中将文本内容标准化为UTF 8
【发布时间】:2010-03-16 17:33:13
【问题描述】:

我们有一个 CMS,其中包含数千个文本/html 文件。事实证明,用户一直在使用各种字符编码(utf-8、utf-8 w BOM、windows 1252、iso-8859-1)上传 text/html 文件。

当这些文件被读取并写入响应时,我们的 CMS 框架会在响应的 content-type 属性上强制使用 charset=UTF-8。

因此,任何非 UTF-8 内容都会以错位字符(?、黑色菱形等,当没有从“本机”字符编码到 UTF-8 的正确字符转换时)显示给用户。此外,这些文档没有附加元数据指示字符集 - 据我所知,判断它们是什么字符集的唯一方法是在文本呈现应用程序(Firefox、Notepadd++ 等)中查看它们并“查看" 查看内容是否“看起来”正确。

有谁知道如何自动/智能地将未知编码的文件转换为 UTF-8?我已经读过这可以通过统计建模来完成,但这就是我想不到的。

关于如何最好地解决问题的想法?

谢谢

【问题讨论】:

标签: java utf-8 character-encoding iso-8859-1 windows-1252


【解决方案1】:

你可以使用ICU4J的CharsetDetector

【讨论】:

    【解决方案2】:

    尝试将其解码为 UTF-8。如果失败则寻找\x92,如果找到则解码为CP1252。否则,解码为 Latin-1。

    【讨论】:

    • 如果不是有效的UTF-8,还不如直接上cp1252。它只对字节 \x80\x9F 产生影响,但几乎不可能有人使用为这些字节指定的字符 ISO-8859-1(它们都是无用的控制代码)。
    • 你为什么只检查 一个 cp1252 扩展字符呢?如果文本包含大括号 引号(\x93\x94)但没有大括号单引号(\x91\x92)怎么办?但就像@bobince 所说,如果它是有效的 ISO-8859-1,你可以放心地假设它是有效的 cp1252。
    • @bobince, Alan:cp1251 和 ISO-8859-15 之间有一个更有趣的区别,这很可能是某些“ISO-8859-1”文档的真正含义——欧元符号这些天并不是完全无关紧要的。
    • @Michael:我不得不说我还没有在野外遇到过 8859-15 文件。我认为看到广泛采用有点太晚了:所有关心标准字符集的人都已经转向 UTF-8,而其他人都坚持使用 cp1252。
    【解决方案3】:

    一般来说,没有办法说。字节序列 63 61 66 C3 A9 与 windows-1252 中的“café”、IBM437 中的“caf├⌐”或 UTF-8 中的“café”同样有效。不过,从统计上讲,最后一种可能性更大。

    如果您不想处理统计方法,一种在大多数情况下都有效的方法是假设任何看起来像 UTF-8 的东西都在,而其他任何东西都在 windows-1252 中。

    或者如果可以使用 UTF-16,请在文件开头查找 FE FF 或 FF FE。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-04
      • 1970-01-01
      • 1970-01-01
      • 2018-10-12
      • 1970-01-01
      • 2018-07-24
      • 1970-01-01
      相关资源
      最近更新 更多