Java:如何确定流的正确字符集编码

新手上路,请多包涵

参考以下线程: Java App : Unable to read iso-8859-1 encoded file correctly

以编程方式确定输入流/文件的正确字符集编码的最佳方法是什么?

我尝试使用以下内容:

 File in =  new File(args[0]);
InputStreamReader r = new InputStreamReader(new FileInputStream(in));
System.out.println(r.getEncoding());

但是在我知道用 ISO8859_1 编码的文件上,上面的代码产生了 ASCII,这是不正确的,并且不允许我将文件的内容正确地呈现回控制台。

原文由 Joel 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 880
2 个回答

我使用了这个库,类似于 jchardet 用于检测 Java 中的编码: https ://github.com/albfernandez/juniversalchardet

原文由 Luciano Fiandesio 发布,翻译遵循 CC BY-SA 4.0 许可协议

您无法确定任意字节流的编码。这是编码的本质。编码意味着字节值与其表示之间的映射。所以每一种编码“都可能”是正确的。

getEncoding() 方法将返回为流设置的编码(阅读 JavaDoc )。它不会为您猜测编码。

一些流会告诉您使用哪种编码来创建它们:XML、HTML。但不是任意字节流。

无论如何,如果需要,您可以尝试自己猜测编码。每种语言的每个字符都有一个共同的频率。在英语中,字符 e 经常出现,但 ê 很少出现。在 ISO-8859-1 流中通常没有 0x00 字符。但是 UTF-16 流有很多。

或者:您可以询问用户。我已经看到应用程序会以不同的编码向您展示文件的片段,并要求您选择“正确的”编码。

原文由 Eduard Wirch 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题