2010-03-16 36 views
1

文本内容规范化为UTF-8,我们有一个CMS,其中有几千text/html的文件。事实证明,用户使用各种字符编码(utf-8,utf-8 w BOM,windows 1252,iso-8859-1)上传了文本/ html文件。如何用Java

当这些文件中读取和写入我们的CMS的框架迫使响应一个charset =上响应的内容类型属性的UTF-8。

因此,如果用户没有从“native”字符编码转换为UTF-8的正确字符转换,那么任何非UTF-8内容都会向用户显示具有错乱字符(?,黑色菱形等)的用户。此外,没有元数据附加到这些文件,表明字符集 - 据我所知,告诉他们是什么字符集的唯一方法是在文本渲染应用程序(Firefox,Notepadd ++等)看他们和“看“在内容上看看它是否”看起来“正确。

有谁知道如何自动/智能未知编码的文件转换为UTF-8?我读过这可以通过统计建模来完成,但那是我的头脑。

思考如何最好地处理这个问题?

感谢

+0

相关问题:http://stackoverflow.com/questions/774075/character-encoding-detection-algorithm和http://stackoverflow.com/questions/499010/java-how-to-determine-the-correct- charset-encoding-of-a-stream – BalusC 2010-03-16 17:52:45

回答

1

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

+0

如果它不是有效的UTF-8,你可以直接去cp1252。它只对字节'\ x80'到'\ x9F'有所影响,但是不太可能有人使用为这些字节指定的字符ISO-8859-1(它们都是无用的控制代码)。 – bobince 2010-03-16 18:03:04

+0

为什么只检查cp1252扩展字符的* 1 *?如果文本包含卷积*双引号('\ x93','\ x94')但不包含单引号('\ x91','\ x92')?但是像@ bobince所说的,如果它是有效的ISO-8859-1,你可以放心地认为它是有效的cp1252。 – 2010-03-16 19:42:05

+0

@bobince,Alan:cp1251和ISO-8859-15之间有一个更有趣的区别,这很可能是“ISO-8859-1”文件中的一部分 - 欧元符号现在并不完全不相关。 – 2010-03-17 14:15:18

0

一般情况下,没有办法告诉。字节序列63 61 66 C3 A9与windows-1252中的“café”,IBM437中的“caf├”或UTF-8中的“café”同样有效。尽管如此,最后一次在统计上更有可能。

如果你不想处理的统计方法,即作品的时间多的方法是假设任何看起来像UTF-8,而别的是Windows 1252。

或者,如果UTF-16是一种可能性,寻找FE FF FF或FE的文件的开头。