gpt4 book ai didi

java - 读取文件时找不到零宽度不间断空间

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:12:07 28 4
gpt4 key购买 nike

我在尝试解析从文件中获取的 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++ 并转换为无 BOM 的 UFT-8 和 ISO 8859-1
  • 在其他文本编辑器(如 sublime)中打开 JSON 文件并保存为 UFT-8
  • 将 JSON 文件复制到 txt 文件并在其中读取
  • 尝试使用 Scanner 而不是 BufferedReader
  • 在 intellij 中,我尝试查看 -> Activity 编辑器 -> 显示空格

如何在字符串开头没有零宽度不间断空格字符的情况下读取此文件?

最佳答案

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 仅在 BOM 本身从 UTF-8 解码为 0xFEFF 时显示为UTF-16(意味着读者检测到 BOM 但没有跳过它)。事实上,众所周知,Java 不处理 UTF-8 BOM(参见错误 JDK-4508058JDK-6378911)。

如果您读取 FileReader documentation ,它说:

The constructors of this class assume that the default character encoding and the default byte-buffer size are appropriate. To specify these values yourself, construct an InputStreamReader on a FileInputStream.

您需要使用能够识别字符集的阅读器来阅读文件内容,最好是能够为您读取 BOM 并根据需要在内部进行 self 调整的阅读器。但更糟糕的情况是,您可以自己打开文件,读取前几个字节以检测是否存在 BOM,然后使用适当的字符集构建读取器来读取文件的其余部分。这是一个使用 org.apache.commons.io.input.BOMInputStream 的例子正是这样做的:

(来自 https://stackoverflow.com/a/13988345/65863)

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

关于java - 读取文件时找不到零宽度不间断空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26407406/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com