0xEF 0xBB 0xBF是UTF-8
BOM,
0xFE 0xFF是UTF-16BE
BOM和
0xFF 0xFE是UTF-16LE
BOM。如果
0xFEFF在字符串的开头存在,则表示您已创建带有BOM的UTF编码文本文件。UTF-16
BOM可以原样显示
0xFEFF,而UTF-8
BOM只会显示
0xFEFFBOM本身已从UTF-8解码为UTF-16(这意味着读者可以检测到BOM,但不会跳过)。
。实际上,众所周知Java不处理UTF-8 BOM(请参见Bug
JDK-4508058和JDK-6378911)。
如果您阅读该
FileReader
文档,它将显示:
此类的构造函数假定默认字符编码和默认字节缓冲区大小是适当的。要自己指定这些值,请在FileInputStream上构造一个InputStreamReader。
您需要使用一种识别字符集的阅读器来读取文件内容,最好是一种能够为您阅读BOM并根据需要在内部进行调整的阅读器。但更糟糕的情况是,您可以自己打开文件,读取前几个字节以检测是否存在BOM表,然后使用适当的字符集构造读取器以读取文件的其余部分。这是一个使用此功能的示例
org.apache.commons.io.input.BOMInputStream:
String defaultEncoding = "UTF-8";InputStream inputStream = new FileInputStream(someFileWithPossibleUtf8Bom);try { BOMInputStream bOMInputStream = new BOMInputStream(inputStream); ByteOrderMark bom = bOMInputStream.getBOM(); String charsetName = bom == null ? defaultEncoding : bom.getCharsetName(); InputStreamReader reader = new InputStreamReader(new BufferedInputStream(bOMInputStream), charsetName); //use reader} finally { inputStream.close();}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)