在读取文件时找不到零宽不间断空格。

4
我在尝试解析从文件中获取的JSON字符串时遇到了一个问题。我的问题是,当我读取它时,在我的字符串开头有一个零宽不换行空格字符(unicode 0xfeff),而我无法摆脱它。由于可能存在其他具有不同Unicode的隐藏字符的机会,我不想使用正则表达式。以下是我的代码:
StringBuilder content = new StringBuilder();
    try {
        BufferedReader br = new BufferedReader(new FileReader("src/test/resources/getStuff.json"));
        String currentLine;
        while((currentLine = br.readLine()) != null) {
            content.append(currentLine);
        }
        br.close();
    } catch(Exception e) {
        Assert.fail();
    }

以下是JSON文件的开头(文件内容过长,无法全部复制粘贴,但我已确认其有效性):

{"result":{"data":{"request":{"year":null,"timestamp":1413398641246,...

以下是我迄今为止尝试过的方法:
  • 将JSON文件复制到Notepad ++并显示所有字符
  • 将文件复制到Notepad ++中,将其转换为UTF-8而没有BOM和ISO 8859-1
  • 在其他文本编辑器(如sublime)中打开JSON文件并保存为UFT-8
  • 将JSON文件复制到txt文件中并在其中读取
  • 尝试使用Scanner而不是BufferedReader
  • 在intellij中,我尝试查看 -> 活动编辑器 -> 显示空格
如何在不在字符串开头添加零宽不换行空格字符的情况下读取此文件?
1个回答

4

0xEF 0xBB 0xBF是UTF-8 BOM0xFE 0xFF是UTF-16BEBOM0xFF 0xFE 是UTF-16LEBOM。如果你的字符串开头有0xFEFF,则表示你创建了带有BOM的UTF编码文本文件。UTF-16 BOM可能会直接显示为0xFEFF,而UTF-8 BOM仅在BOM本身从UTF-8解码为UTF-16时才会显示为0xFEFF(这意味着读取器检测到了BOM,但没有跳过它)。实际上,众所周知Java不处理UTF-8 BOM(请参见bugsJDK-4508058JDK-6378911)。

如果您阅读FileReader 文档,它会说:

这个类的构造函数假定默认字符编码和默认字节缓冲区大小是适当的。要自己指定这些值,请在FileInputStream上构建一个InputStreamReader。

您需要使用识别字符集的阅读器读取文件内容,最好使用可以为您读取BOM并根据需要自我调整的阅读器。但在最坏的情况下,您可以打开文件并读取前几个字节以检测是否存在BOM,然后使用适当的字符集构建阅读器来读取其余部分。以下示例使用org.apache.commons.io.input.BOMInputStream来实现:

(引用自https://dev59.com/dG445IYBdhLWcg3wXZIy#13988345)

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

1
太棒了,它起作用了。只是为了澄清一些事情,如果其他人阅读这篇文章。创建 BomInputStream 就是移除 bom 的方法,你可以在 这里 找到更多信息。 - Jeremy W

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