【发布时间】:2020-11-20 20:47:51
【问题描述】:
我们有一个字节序列输入,我们需要检查它是 UTF-8 还是纯 ASCII 或其他。换句话说,我们必须拒绝 ISO-8859-X latin-x 或其他编码输入。
我们的第一选择是 Tika,但我们有一个问题:普通的 ascii 输入(根本没有重音字符的输入)通常被检测为 ISO-8859-2 或 ISO-8859-1!
这是有问题的部分:
CharsetDetector detector = new CharsetDetector();
String ascii = "Only ascii Visible:a;Invisible:GUID\nX;XXddd\n";
detector.setText(ascii.getBytes());
System.out.println("detected charset: " + detector.detect().getName());
String ascii2 = "Only ascii plain english text";
detector.setText(ascii2.getBytes());
System.out.println("detected charset: " + detector.detect().getName());
String ascii3 = "this is ISO-8859-2 do not know why";
detector.setText(ascii3.getBytes());
System.out.println("detected charset: " + detector.detect().getName());
String ascii4 = "this is UTF-8 but tell me why o why maybe sdlkfjlksdjlkfjlksdjflkjlskdjflkjsdjkflkdsjlkfjldsjlkfjldkjkfljdlkjsdfhjshdkjfhjksdhjfkksdfksjdfhkjsdhj";
detector.setText(ascii4.getBytes());
System.out.println("detected charset: " + detector.detect().getName());
这是输出
detected charset: ISO-8859-2
detected charset: ISO-8859-1
detected charset: ISO-8859-2
detected charset: UTF-8
我应该如何使用 Tika 来获得合理的结果?
Ps:这是一个迷你演示:https://github.com/riskop/tikaproblem
【问题讨论】:
-
使用更长的文本字符串?这是基于非常短字符串的概率
-
输入实际上是 csv 文件的内容。这些文件实际上包含应用程序的值列表。有些文件很短,不到 100 字节。这就是我所拥有的。
-
许多编码(例如 iso-8859)在 7 位范围内都有一组共同的字符(英语等)。我建议您查看实际的字符表,并考虑一下您的要求的实际含义......
标签: encoding detection apache-tika