Java String.length()的奇怪行为

Java String.length()的奇怪行为,java,string,string-length,Java,String,String Length,我有一门主修课: public class Main { // args[0] - is path to file with first and last words // args[1] - is path to file with dictionary public static void main(String[] args) { try { List<String> firstLastWords = FileParser.getWords(args

我有一门主修课:

public class Main {

// args[0] - is path to file with first and last words
// args[1] - is path to file with dictionary 
public static void main(String[] args) {
    try {
        List<String> firstLastWords = FileParser.getWords(args[0]);
            System.out.println(firstLastWords);
        System.out.println(firstLastWords.get(0).length());

    } catch (IOException ex) {
        ex.printStackTrace();
    }
}
}
程序返回:

[тор, кит]
4
[т, тор, кит]
2
如果文件包含:

тор
кит
т
тор
кит
程序返回:

[тор, кит]
4
[т, тор, кит]
2

即使文件包含:
//跳转到下一行
цц
ццц

程序返回:

[, тор, кит]
1
其中数字-是列表中第一个字符串的长度


因此,问题是为什么它还要计算一个符号?

西里尔字母很难用正则表达式捕获,例如
\p{Graph}
不起作用,尽管它们是清晰可见的字符。不管怎么说,这不是OP的问题

实际问题可能是由于存在其他不可见字符,可能是控制字符。尝试使用以下正则表达式删除更多内容:
replaceAll(“(\\s |\\p{Cntrl})+”,”)
。您可以使用正则表达式进一步扩展到其他情况

谢谢大家

该符号如@Bill所述为BOM(),位于文本文件的开头。 所以我在这行找到了这个符号:

System.out.println(((int)firstLastWords.get(0).charAt(0)));
它给了我65279

然后我就改了这行:
String line1=line.replaceAll(“\\s+”,”)
对此

String line1 = line.replaceAll("\uFEFF","");

从字符串#length的文档中—“返回此字符串的长度。长度等于字符串中Unicode代码单元的数量。”这如何解释OP的问题?我不理解在这个问题上的反对票-这家伙正确地包括了所有相关的代码,描述了发生了什么,并描述了他期望的内容。这几乎是一个正确的代码问题的后续问题。我每天都会看到几十个可怕的代码问题,没有得到任何反对票。请解释你自己,选民们。你的档案里可能有某种无法打印的字符。你能试着检查一下字符串中的每个字符并单独打印出来吗?@erwinbolwidt-我完全同意;我真的投了赞成票,你能试试这个:
replaceAll(“(\\s|\\p{Cntrl}\\n|\\r)+”,“你能告诉我结果吗?”)
-并告诉我结果。试着把这个代码
放在(字节b:line1.getBytes()){System.out.print((长)b)&0xFF);System.out.print(“/”)System.out.print(}System.out.println()以确定隐藏的字符是什么。