为了账号安全,请及时绑定邮箱和手机立即绑定

读UTF-8 - BOM标记

/ 猿问

读UTF-8 - BOM标记

收到一只叮咚 2019-09-06 11:06:10

读UTF-8 - BOM标记

我正在通过FileReader读取文件 - 文件是UTF-8解码(带BOM)现在我的问题是:我读取文件并输出一个字符串,但遗憾的是BOM标记也输出了。为什么会这样?

fr = new FileReader(file);br = new BufferedReader(fr);
    String tmp = null;
    while ((tmp = br.readLine()) != null) {
    String text;    
    text = new String(tmp.getBytes(), "UTF-8");
    content += text + System.getProperty("line.separator");}

第一行后的输出

?<style>


查看完整描述

3 回答

?
紫衣仙女

在Java中,您必须手动使用UTF8 BOM(如果存在)。Java bug数据库中记录了此行为,此处和此处。暂时没有解决方法,因为它会破坏JavaDoc或XML解析器等现有工具。在Apache的IO共享提供了一个BOMInputStream处理这种情况。

看看这个解决方案:处理带有BOM的UTF8文件


查看完整回答
反对 回复 2019-09-10
?
若吾皇

最简单的修复可能只是\uFEFF从字符串中删除结果,因为它几乎不可能出于任何其他原因。

tmp = tmp.replace("\uFEFF", "");

另请参阅此番石榴错误报告


查看完整回答
反对 回复 2019-09-10
?
呼如林

使用Apache Commons库。

类: 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();}



查看完整回答
反对 回复 2019-09-10

添加回答

回复

举报

0/150
提交
取消
意见反馈 邀请有奖 帮助中心 APP下载
官方微信