我该如何在读取文件之前确定文件使用的编码方式?

3
我遇到了一个问题。
文件可以使用一些编码方式进行编写,例如UTF-8UTF-16UTF-32等。
当我读取一个UTF-16文件时,我使用以下代码:
 BufferedReader in = new BufferedReader(
                           new InputStreamReader(
                           new FileInputStream(file), "UTF16"));

在读取文件之前,我如何确定文件使用哪种编码方式?

当我使用UTF-16读取UTF-8编码的文件时,无法正确读取字符。


1
你真的无法确定。\x00\x00\x00\x00 是 UTF-8 的四个空字符(U+00000000),还是 UTF-16(大端序)的两个空字符,或者是 UTF-32 的一个空字符? - Kerrek SB
2
这就像是在问:“在和某人交谈之前,我能知道他们说什么语言吗?” - raphaëλ
你要么提前知道,要么需要类似于BOM的东西。 - David Heffernan
3个回答

2

没有好的方法来做到这一点。你所问的问题就像是通过观察一个数字来确定它的进制数。例如,101 的进制是多少?

最好的解决方案是将数据读入字节数组中。然后你可以使用String(byte[] bytes, Charset charset)方法以多种编码方式进行测试,从最有可能的到最不可能的。


0

你无法确定编码格式。通常情况下,文件的前四个字节(如果存在BOM)决定了使用哪种转换格式。你无法从外部直接看到这些字节。


2
甚至这也不一定是正确的。对于任意文件,没有强制的“头部”。 - Kerrek SB
当然,但特别是在UTF-16中,通常会有BOM或编码的外部声明。 - Joey
1
如果您有编码的外部声明,那么整个问题就无关紧要了,不是吗? - Kerrek SB

0

你可以读取前几个字节并尝试猜测编码方式。

如果其他方法都失败了,可以尝试使用不同的编码方式进行阅读,直到找到一个能正常解码且“看起来”正确的编码方式为止。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接