我有一个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
转换为需要编码的字节数组,然后比较两个字节数组,但这似乎是一种相当粗略的方法,是否有更优雅的方式?
您可以尝试将line
的字符分别打印为整数来检查字符串的实际组成方式。在我的应用程序中我只使用BufferedReader reader = new BufferedReader(new
InputStreamReader(is));
并且能够正确使用String的split方法...所以也许startsWith
也能正常工作。
经过一些研究和使用String.getBytes()
后,可以看出问题出在字节顺序标记或BOM上。 Android Studio没有在工具提示中显示那些额外的字符作为问号,因为它通常会让我感到困惑。