IT이야기

자바. 문자열을 비교할 때 악센트 무시

cyworld 2021. 3. 31. 21:17
반응형

자바. 문자열을 비교할 때 악센트 무시


문제는 쉽습니다. JAVA에 두 개의 문자열을 비교하고 악센트 부호가있는 문자를 무시하고 true를 반환하는 기능이 있습니까?

String x = "Joao";
String y = "João";

동등한 반환.

감사


Collator 클래스 를 사용해야한다고 생각합니다 . 강도와 로케일을 설정할 수 있으며 문자를 적절하게 비교합니다.

Java 1.6 API에서 :

비교에서 중요하다고 간주되는 차이 수준을 결정하기 위해 Collator의 강도 속성을 설정할 수 있습니다. PRIMARY, SECONDARY, TERTIARY 및 IDENTICAL의 네 가지 강점이 제공됩니다. 언어 기능에 대한 정확한 강점 할당은 로케일에 따라 다릅니다. 예를 들어 체코 어에서 "e"와 "f"는 1 차 차이로 간주되고 "e"와 "ě"는 2 차 차이, "e"와 "E"는 3 차 차이, "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));
}

분음 부호를 무시하도록 구성한 경우 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);    
}

이러한 종류의 변환의 문제는 악센트가있는 문자에서 악센트가없는 문자로의 명확한 매핑이 항상 존재하지 않는다는 것입니다. 코드 페이지, 지역화 등에 따라 다릅니다. 예를 들어, "a"에 해당하는 액센트가있는 a입니까? 인간에게는 문제가 아니라 컴퓨터에게는 까다 롭습니다.

AFAIK Java에는 현재 현지화 옵션을 조회하고 이러한 종류의 변환을 수행 할 수있는 변환 기능이 내장되어 있지 않습니다. ICU ( http://site.icu-project.org/ ) 와 같이 유니 코드를 더 잘 처리하는 외부 라이브러리가 필요할 수 있습니다.

참조 URL : https://stackoverflow.com/questions/2373213/java-ignore-accents-when-comparing-strings

반응형