在附加到UTF-16文件时,Apache FileUtils是否有办法计算BOM?

时间:2016-03-30 20:44:16

标签: java utf-16 byte-order-mark fileutils

我有一大堆数据,其中包括我正在缓冲和流式传输到文件的西班牙语和英语字符。第一次推送很棒,并编写了一个新的UTF-16BE \ w BOM文件。

当我尝试附加下一组数据时,FileUtils.write()调用String.getBytes(" UTF-16"),它在字节数组的开头创建另一个BOM&# 39;即将附加。

有没有办法让FileUtils检测它是否附加并修剪BOM(如果存在)?

2 个答案:

答案 0 :(得分:0)

好吧,我想我想出了我想做的事。

private byte[] withoutBOM(final String string, final Charset encoding) throws UnsupportedEncodingException {
    byte[] bytes = string.getBytes(encoding);
    return Arrays.copyOfRange(bytes, bytes.length % string.length(), bytes.length);
}

这将假设任何编码都是字符串的偶数倍(UTF-16例如每个字符有两个字节)并从字节数组的开头剪掉任何元数据。这样我只要在检测到我附加到文件的时候就不知道编码实际是什么就调用这个方法

答案 1 :(得分:0)

在Java中默认使用charset" UTF-16"始终在开头添加BOM。然而,这两个变种" UTF-16BE"和" UTF-16LE"不写BOM:

来自Charset的文档(请参阅"编码"部分时):

  

解码时,UTF-16BE和UTF-16LE字符集将初始字节顺序标记解释为ZERO-WIDTH NON-BREAKING SPACE;在编码时,它们不会写字节顺序标记。

     

解码时,UTF-16字符集解释输入流开头的字节顺序标记,以指示流的字节顺序,但如果没有字节顺序标记则默认为big-endian;在编码时,它使用big-endian字节顺序并写入一个big-endian字节顺序标记。

因此,您只需检查现有BOM并选择适当的编码即可将UTF-16文本添加到文件中。

BTW:对于英语和西班牙语文本,UTF-8就足够了,而且效率更高......