这个问题很简单。在JAVA中是否有任何函数可用于比较两个字符串并忽略带重音字符而返回true?
例如:
String x = "Joao";
String y = "João";
返回相等的结果。
谢谢
这个问题很简单。在JAVA中是否有任何函数可用于比较两个字符串并忽略带重音字符而返回true?
例如:
String x = "Joao";
String y = "João";
返回相等的结果。
谢谢
我认为你应该使用Collator类。它允许你设置强度和区域设置,并适当地比较字符。
根据Java 1.6 API:
您可以设置Collator的strength属性来确定在比较中考虑的差异级别。提供了四种强度:PRIMARY、SECONDARY、TERTIARY和IDENTICAL。强度与语言特征的确切分配因区域设置而异。例如,在捷克语中,"e"和"f"被视为主要差异,而"e"和"ě"是次要差异,"e"和"E"是三级差异,"e"和"e"相同。
我认为这里重要的一点(人们试图表达的)是“Joao”和“João”永远不应该被视为相等,但如果你正在进行排序,你不希望它们基于它们的ASCII值进行比较,否则你会得到像Joao、John、João这样的东西,这是不好的。使用Collator类肯定会正确处理这个问题。
我并不同意该问题的前提(请不要告诉别人我这么说了),但你可以使用java.text.Normalizer
,并用NFD
来进行规范化:这会将重音从它所附着的字母中分离出来。然后你可以过滤掉重音符号并进行比较。
如果您想忽略重音进行比较/排序,则可以使用来自Apache StringUtils库的stripAccents函数:
public int compareStripAccent(String a, String b) {
return StringUtils.stripAccents(a).compareTo(StringUtils.stripAccents(b));
}
如果您将Java的Collator配置为忽略变音符号,则对于"a"和"á",它都会返回0。
public boolean isSame(String a, String b) {
Collator insenstiveStringComparator = Collator.getInstance();
insenstiveStringComparator.setStrength(Collator.PRIMARY);
return insenstiveStringComparator.compare(a, b) == 0;
}
isSame("a", "á") 会返回 true。
public boolean insenstiveStringComparator (String a, String b) {
java.text.Collator collate = java.text.Collator.getInstance();
collate.setStrength(java.text.Collator.PRIMARY);
collate.setDecomposition(java.text.Collator.CANONICAL_DECOMPOSITION);
return collate.equals(a, b);
}