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

问题描述 投票:-4回答:2

我有一个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转换为需要编码的字节数组,然后比较两个字节数组,但这似乎是一种相当粗略的方法,是否有更优雅的方式?

java unicode string-comparison utf-16
2个回答
0
投票

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.