String.startswith 将 UTF-16 字符串与文字进行比较时失败
String.startswith fails when comparing UTF-16 string to literal
我有一个 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]")) ...
但是这个returns错误即使行实际上"starts"这个字符序列。
在检查 startsWith
的源代码时,我可以看到比较是逐个字符进行的。但据我所知,Java 实际上在内部表示使用这种特定编码的字符串,所以为什么比较失败?在这种情况下,正确的比较方法是什么?
想到的一件事是将 String
转换为具有所需编码的字节数组,然后比较两个字节数组,但这似乎是一种相当粗糙的方法,有没有更优雅的方法?
您可以尝试将 line
的字符作为整数单独打印出来,以检查字符串的实际组成方式。在我的应用程序中,我只使用
BufferedReader reader = new BufferedReader(new
InputStreamReader(is));
并且能够正确使用 String 的 split 方法......所以也许 startsWith
也能正常工作。
经过一些研究和使用 String.getBytes()
可以看出问题出在字节顺序标记或 BOM 上。 Android Studio 没有像往常一样在工具提示中将这些额外字符显示为问号,这让我很困惑。
我有一个 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]")) ...
但是这个returns错误即使行实际上"starts"这个字符序列。
在检查 startsWith
的源代码时,我可以看到比较是逐个字符进行的。但据我所知,Java 实际上在内部表示使用这种特定编码的字符串,所以为什么比较失败?在这种情况下,正确的比较方法是什么?
想到的一件事是将 String
转换为具有所需编码的字节数组,然后比较两个字节数组,但这似乎是一种相当粗糙的方法,有没有更优雅的方法?
您可以尝试将 line
的字符作为整数单独打印出来,以检查字符串的实际组成方式。在我的应用程序中,我只使用
BufferedReader reader = new BufferedReader(new
InputStreamReader(is));
并且能够正确使用 String 的 split 方法......所以也许 startsWith
也能正常工作。
经过一些研究和使用 String.getBytes()
可以看出问题出在字节顺序标记或 BOM 上。 Android Studio 没有像往常一样在工具提示中将这些额外字符显示为问号,这让我很困惑。