【发布时间】:2019-01-18 03:32:31
【问题描述】:
UTF-8 的 byte order mark (BOM) 是 EF BB BF,如 section 23.8 of the Unicode 9 规范中所述(搜索“签名”)。
在 Java 中删除这个的许多解决方案只是一个简单的一行代码:
replace("\uFEFF", "")
我不明白为什么会这样。
这是我的测试代码。我在调用 String#replace 后检查了二进制文件,我发现 EF BB BF 确实被删除了。看到这个code run live at IdeOne.com。
太神奇了。为什么会这样?
@Test
public void shit() throws Exception{
byte[] b = new byte[]{-17,-69,-65, 97,97,97};//EF BB BF 61 61 61
char[] c = new char[10];
new InputStreamReader(new ByteArrayInputStream(b),"UTF-8").read(c);
byte[] bytes = new StringBuilder().append(c).toString().replace("\uFEFF", "").getBytes();//
for(byte bt: bytes){//61 61 61, we can see EF BB BF is indeed removed
System.out.println(bt);
}
}
【问题讨论】:
-
您将编码与字符代码点混淆了。此外,在正常使用中,UTF-8 编码的内容不应使用 BOM。
标签: java byte-order-mark