使用 BOM 标记读取 UTF-8:了解意外的 BOM 输出
以字节顺序读取 UTF-8 编码的文件时标记(BOM),有可能会遇到输出字符串中包含BOM。发生这种情况是因为 BOM(Unicode 标识符)作为特定字节序列存储在文件的开头。
在给定的 Java 代码中,适当地利用 FileReader 和 BufferedReader 来处理 UTF-8 文件读取。但是,问题出现在后续行中:
text = new String(tmp.getBytes(), "UTF-8");
此行尝试使用 UTF-8 字符集对 tmp 字符串中存储的字节进行解码。但是,String 上的 getBytes() 方法不会保留原始文件中的 BOM 标记。因此,解码过程会忽略 BOM,并且它实际上会丢失。
要在输出字符串中保留 BOM 标记,需要对代码进行轻微调整:
byte[] bytes = tmp.getBytes("UTF-8"); if (isUTF8WithBOM(bytes)) { text = new String(bytes, 3, bytes.length - 3); } else { text = new String(bytes, "UTF-8"); }
isUTF8WithBOM 方法检查字节数组是否以 UTF-8 BOM 序列(0xEF、0xBB、0xBF)开头。如果为 true,则通过从第三个字节开始对字节数组进行切片来删除 BOM。这可确保后续解码过程在输出字符串中包含 BOM 标记。
以上是Java读取UTF-8文件时如何保留BOM?的详细内容。更多信息请关注PHP中文网其他相关文章!