将UTF-16字符串与literal进行比较时,String.startswith失败

时间:2017-12-23 22:31:03

标签: java unicode string-comparison utf-16

我有一个Unicode(“Windows Notepad Unicode”或UTF-16LE)文本文件,我从中读取这样的行:

    FileInputStream is = new FileInputStream(cmdFile);
    BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-16LE"));
    String line = reader.readLine();

现在我需要检查行是否以特定字符序列开头:

if (line.startsWith("[COMMAND]")) ...

但即使行实际上“开始”了这个字符序列,这也会返回false。
在检查startsWith的源代码时,我可以看到比较是逐字逐句完成的。但据我所知,Java实际上在内部使用这种特殊编码表示字符串,那么为什么比较会失败呢?在这种情况下,比较的正确方法是什么?要记住的一件事是将String转换为需要编码的字节数组,然后比较两个字节数组,但这似乎是一种相当粗略的方法,是否有更优雅的方式?

2 个答案:

答案 0 :(得分:0)

您可以尝试将line的字符分别打印为整数,以检查字符串的实际组成方式。在我的应用程序中我只使用     BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 并且能够正确使用String的split方法......所以也许startsWith也能正常工作。

答案 1 :(得分:0)

经过一些研究并使用String.getBytes(),可以看出问题出在字节顺序标记或BOM上。 Android Studio没有在工具提示中显示那些额外的字符作为问号,因为它通常会让我感到困惑。