有很多例子说明为什么和何时使用不正确的区域设置会导致java.lang.String.equalsIgnoreCase
失败。
但我没有找到任何正确使用方式的示例。与java.lang.String.toUpperCase
不同,它没有带有区域设置参数的版本。将两个字符串转换为大写或小写似乎是浪费的,特别是当您正在处理进行许多比较的应用程序时。
考虑到区域设置和性能,正确的方法是什么来进行忽略大小写的字符串比较?
有很多例子说明为什么和何时使用不正确的区域设置会导致java.lang.String.equalsIgnoreCase
失败。
但我没有找到任何正确使用方式的示例。与java.lang.String.toUpperCase
不同,它没有带有区域设置参数的版本。将两个字符串转换为大写或小写似乎是浪费的,特别是当您正在处理进行许多比较的应用程序时。
考虑到区域设置和性能,正确的方法是什么来进行忽略大小写的字符串比较?
//retrieve the runtime user's locale
Locale locale = new Locale(getUserLocale());
//pass the user's locale as an argument
Collator myCollator = Collator.getInstance(locale);
//set collator to Ignore case but not accents
//(default is Collator.TERTIARY, which is
//case sensitive)
myCollator.setStrength(Collator.SECONDARY);
int i = myCollator.compare(stringA,stringB);
显然,在其他情境下你可能会选择不同的地区设置。
Matcher matcher = Pattern.compile("^" + myOtherString + "$",
Pattern.CASE_INSENSITIVE | Pattern.LITERAL | Pattern.UNICODE_CASE).matcher();
if (matcher.matches(myString)) {
// ...
}
这个函数锚定了你想要比较的字符串,并指定了对字面字符串进行 Unicode 感知的不区分大小写匹配。
String.equalsIgnoreCase
会遇到与此相同的问题。比较需要考虑区域设置,而不仅仅是Unicode。(根据String
javadocs,String.equalsIgnoreCase
也支持Unicode) - Stephen C
Collator
? - fge.equalsIgnoreCase()
出现错误结果的示例吗?我很好奇... - fge"\u0130".equalsIgnoreCase("\u0130".toLowerCase())
。该代码返回false(OpenJDK 1.8.0_121)。 - Bernie