utf 8字节顺序标记在Java中会导致文件读取出错
我正在尝试使用Java读取CSV文件。有些文件的开头可能有字节顺序标记,但不是全部。当存在时,字节顺序将与第一行的其余部分一起读取,从而导致字符串比较出现问题
有没有一种简单的方法可以跳过字节顺序标记
你可以在下面搜索框中键入要查询的问题!
我正在尝试使用Java读取CSV文件。有些文件的开头可能有字节顺序标记,但不是全部。当存在时,字节顺序将与第一行的其余部分一起读取,从而导致字符串比较出现问题
有没有一种简单的方法可以跳过字节顺序标记
# 1 楼答案
为了简单地从文件中删除BOM字符,我建议使用Apache Common IO
将include设置为false,则BOM表字符将被排除
# 2 楼答案
编辑:我在GitHub上发布了一个合适的版本:https://github.com/gpakosz/UnicodeBOMInputStream
这是我不久前编写的一个类,我只是在粘贴之前编辑了包名。没什么特别的,它与SUN的bug数据库中发布的解决方案非常相似。把它加入到你的代码中,你就没事了
你是这样使用它的:
# 3 楼答案
Apache Commons IO库有一个} (javadoc) :
InputStream
可以检测和丢弃BOM:^{如果您还需要检测不同的编码,它还可以区分各种不同的字节顺序标记,例如UTF-8与UTF-16大+小端-详细信息,请参见上面的文档链接。然后,您可以使用检测到的^{} 来选择一个^{} 来解码流。(如果您需要所有这些功能,可能有一种更精简的方法来实现这一点——可能是BalusC回答中的UnicodeReader?)。请注意,一般来说,没有很好的方法来检测某些字节的编码方式,但是如果流以BOM开头,显然这会很有帮助
编辑:如果需要检测UTF-16、UTF-32等中的BOM,则构造函数应为:
Upvote@martin charlesworth的评论:)
# 4 楼答案
更简单的解决方案:
使用示例:
它适用于所有5种UTF编码
# 5 楼答案
Google Data API有一个^{} 自动检测编码
您可以使用它来代替
InputStreamReader
。这里有一个稍微精简的源代码摘录,非常简单:# 6 楼答案
@rescdsk已经提到了
Apache Commons IO
库的BOMInputStream,但是我没有看到它提到如何在没有BOM的情况下获得InputStream
下面是我在Scala的表现