读取文件时找不到零宽度无间隔

读取文件时找不到零宽度无间隔,第1张

读取文件时找不到零宽度无间隔

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只会显示
0xFEFF
BOM本身已从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();}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5562142.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存