我将一个文件读入一个字节数组。然后,我使用ICU4J来检测文件的编码(我不知道可能是什么编码,这些文件可以有多个不同的编码)并返回一个Unicode字符串。如下所示:
byte[] fileContent = // read file into byte array
CharsetDetector cd = new CharsetDetector();
cd.setText(fileContent);
CharsetMatch cm = cd.detect();
String result = cm.getString();当我的文件使用UTF-16LE编码时,"result“中的第一个字符是byte-order-mark。我对此不感兴趣,因为它是特定于编码方案的,而不是文件内容的一部分,所以我希望它会消失。
然而,ICU4J返回了它。为什么会发生这种情况,有什么方法可以解决这个问题吗?我看到的唯一解决方案是手动检查返回的字符串中的第一个字符是否是字节顺序标记,并手动剥离它。有没有更干净/更好的方法?
发布于 2013-01-28 22:27:47
我刚刚查阅了文件。icu-project.org/apiref/icu4j/com/ibm/icu/text/…。他们实际上说它返回相应的Java字符串,但他们没有说任何关于删除BOM的内容。因此,如果它一开始就在那里,我会期望它在那里。
对我来说,它也被检索是很自然的。如果他们要修剪BOM,我希望他们在文档中明确提到这一点。
我认为答案是这里unicode.org/faq/utf_om.html#Bom1-“在一些更高级别的协议下,在该协议定义的Unicode数据流中可能强制(或禁止)使用物料清单。”
我想差不多就是这样了。如果BOM是必填项,则必须重新添加。如果BOM被禁止,过滤掉它被认为是很容易的部分,我猜:)
https://stackoverflow.com/questions/14563359
复制相似问题