Java String.contains()不处理西里尔字符串

时间:2015-09-17 11:37:41

标签: java

以下是发生的事情。

“лосан”中的用户类型

我有一堆产品,其位置是“лосанджелис”

如果我这样做:

String userInput = "лос ан"
for(Product product : products) {

    if(product.getCity().trim().toLowerCase().contains(userInput.trim().toLowerCase())) {
        System.out.println("MATCH");
    }

}

我没有得到MATCH。

这适用于拉丁字符

3 个答案:

答案 0 :(得分:1)

尝试在等式的两边指定toLowerCase()中的Locale:http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#toLowerCase(java.util.Locale)

答案 1 :(得分:1)

编辑器和编译器(javac -encoding)必须使用相同的编码。

编译器编码很容易完成。编辑器源编码可以用程序员的编辑器如NotePad ++或JEdit进行测试,它可以切换编码。

您也可以通过u-escape Java源文本来检查:

String userInput = "\u043b\u043e\u0441 \u0430\u043d";

如果不起作用,编码之间就会出现差异。

此外已提及String.toLowerCase(new Locale("ru", "RU"))等。

答案 2 :(得分:0)

使用jdk 1.8.0_45,以下代码在两种情况下都给出匹配:

System.out.println("лос анджелис".trim().toLowerCase().contains("лос ан".trim().toLowerCase()));
System.out.println("лос анджелис".trim().toLowerCase(Locale.ROOT).contains("лос ан".trim().toLowerCase(Locale.ROOT)));

正如其他人已经提到的那样,您可能会寻找String#toLowerCase作为{{3}}的参数。