为什么ICU4J在将字节数组读入String时返回字节顺序标记?

时间:2013-01-28 13:43:08

标签: java encoding icu

我将文件读入一个字节数组。然后我使用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”中的第一个字符是字节顺序标记。我对此并不感兴趣,因为它特定于编码方案而不是文件内容的真正部分,我预计它会消失。

然而ICU4J还给它了。为什么会发生这种情况并且有什么方法可以解决这个问题?我看到的唯一解决方案是手动检查返回的String中的第一个字符是否是字节顺序标记并手动剥离它。是否有更清洁/更好的方式?

1 个答案:

答案 0 :(得分:3)

我刚刚查阅了文档... icu-project.org/apiref/icu4j/com/ibm/icu/text/ ...事实上,他们说它返回相应的Java String,但他们没有说删除BOM。所以我希望它在那里,如果它是第一位的。

对我而言,它也是自然的。如果他们正在修改BOM,我希望他们在文档中明确提到它。

  

我认为答案在这里是unicode.org/faq/utf_bom.html#bom1 - “在某些更高级别的协议下,在该协议中定义的Unicode数据流中可能必须使用BOM(或禁止使用)。”

我认为这就是它。如果BOM是必需的,则必须再次添加。如果禁止使用BOM,则将其过滤掉,我认为这很简单:)