防止Unicode字节顺序标记写入文件的中间

时间:2014-07-06 09:30:00

标签: java unicode byte-order-mark filechannel

此代码在文件通道中写入两个字符串

final byte[] title = "Title: ".getBytes("UTF-16");
final byte[] body = "This is a string.".getBytes("UTF-16");
ByteBuffer titlebuf = ByteBuffer.wrap(title);
ByteBuffer bodybuf = ByteBuffer.wrap(body);
FileChannel fc = FileChannel.open(p, READ, WRITE, TRUNCATE_EXISTING);
fc.position(title.length); // second string written first, but not relevant to the problem
while (bodybuf.hasRemaining()) fc.write(bodybuf);
fc.position(0);
while (titlebuf.hasRemaining()) fc.write(titlebuf);

每个字符串都以BOM为前缀。

[Title: ?T]  *254 255* 0 84 0 105 0 116 0 108 0 101 58 0 32 *254 255* 0 84

虽然可以在文件的开头添加一个,但是当流中间有一个时会产生问题。

如何防止这种情况发生?

1 个答案:

答案 0 :(得分:2)

当您使用BOM调用获取UTF-16时插入BOM字节:

final byte[] title = "Title: ".getBytes("UTF-16");

检查title.length,你会发现它包含额外的2个字节用于BOM标记

所以你可以在封装到ByteBuffer之前处理这些数组并从中删除BOM,或者在将ByteBuffer写入文件时可以忽略它

其他解决方案,您可以使用UTF-16 Little / BIG Endianness,它不会写BOM标记:

final byte[] title = "Title: ".getBytes("UTF-16LE"); 

如果不需要UTF-16,您可以使用UTF-8:

final byte[] title = "Title: ".getBytes("UTF-8");