Java有获取各种字节顺序标记的方法吗?

4

我正在寻找一个Java中的实用方法或常量,可以返回与编码相应的字节顺序标记的字节,但我似乎找不到。有这样一个方法吗?我真的很想做这样的事情:

byte[] bom = Charset.forName( CharEncoding.UTF8 ).getByteOrderMark();

这里提到的 CharEncoding 是来自于 Apache Commons 的。


请查看以下网址:https://dev59.com/e3I-5IYBdhLWcg3weoPR#1835529 - Gregory Pakosz
5个回答

4
Java不识别UTF-8的字节顺序标记。请参见错误45080586378911
要点是:虽然添加了支持,但破坏了向后兼容性,因此被撤回。您需要自己进行UTF-8的BOM识别。

3

2
您可以像这样生成BOM:
byte[] utf8_bom = "\uFEFF".getBytes("UTF-8");
byte[] utf16le_bom = "\uFEFF".getBytes("UnicodeLittleUnmarked");

如果您希望使用此方法为其他编码创建BOM,请确保使用不会自动插入BOM的编码版本,否则将会重复。这种技术仅适用于Unicode编码,对于其他编码(如Windows-1252)将无法产生有意义的结果。

我的具体情况是编写一个UTF-8格式的CSV文件。据我所知,UTF-8 BOM是唯一的方法,可以让Excel不尝试使用默认字符编码读取该文件。 - Brandon DuRette
没有一个实用方法可以帮助您处理Excel文件,但是将0xEF 0xBF 0xBF写入OutputStream不应该成为问题。在将流包装在UTF-8编码的Writer中之前,请刷新这些字节。 - McDowell
我不会说FAQ中“不鼓励使用它”。UTF-8 BOM确实没有指定“字节顺序标记”(使其有些不准确),但它绝对有助于表示流使用UTF-8编码。 - Dan Breslau
1
这是一个公正的评论 - 我已经更新了帖子。不过我无法帮助感觉他们没有使用它:http://blogs.msdn.com/oldnewthing/archive/2007/04/17/2158334.aspx - McDowell

1

据我所见,JDK和Apache项目中都没有任何相关的内容。

不过 Eclipse EMF 中有一个枚举类型提供了支持:

org.eclipse.emf.ecore.resource.ContentHandler.ByteOrderMark

我不确定这对你有没有帮助?

关于每种编码类型的各种BOM,这里还有更多信息,你可以编写一个简单的辅助类或枚举来处理它...

http://mindprod.com/jgloss/bom.html

希望这有所帮助。说实话,我很惊讶这不在Commons I/O中。

现在它在这里:http://commons.apache.org/io/apidocs/org/apache/commons/io/input/BOMInputStream.html - rescdsk

1
值得注意的是,许多编码并不使用任何字节顺序标记。例如,在UTF-8中,空字符串只是一个空的byte[]。虽然UTF-8指定了BOM,但在Java中很少使用,并且并不总是被支持。

2
因为这似乎写得不正确,所以被踩了。包含UTF-8 BOM(EFBBBF)的三字节序列将被解释为空的UTF-8字符串如果应用程序知道如何处理BOM。 (如果不知道,BOM将导致问题,无论是空字符串还是其他值。) - Dan Breslau
Java 不支持 UTF-8 的 BOM 标记。我看过有人因此受到影响(文本编辑器决定添加 BOM,然后 javac 就出错了)。 - Adam Jaskiewicz
彼得的回答是不正确的,参见http://en.wikipedia.org/wiki/Byte_order_mark#Representations_of_byte_order_marks_by_encoding。 - t0r0X

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接