문제

문제는 아시다시피 수천 개의 캐릭터가 있다는 것입니다. 유니 코드 차트에서 그리고 나는 모든 유사한 문자를 영어 알파벳으로하는 글자로 변환하고 싶습니다.

예를 들어 여기에는 몇 가지 전환이 있습니다.

ҥ->H
Ѷ->V
Ȳ->Y
Ǭ->O
Ƈ->C
tђє Ŧค๓เℓy --> the Family
...

그리고 20 개 이상의 레터 A/A가 있다는 것을 알았습니다. 그리고 나는 그것들을 분류하는 방법을 모른다. 그들은 건초 더미에서 바늘처럼 보입니다.

유니 코드 숯의 전체 목록이 있습니다 http://www.ssec.wisc.edu/~tomw/java/unicode.html 또는 http://unicode.org/charts/charindex.html . 아래로 스크롤하고 문자의 변형을보십시오.

이 모든 것을 Java로 어떻게 변환 할 수 있습니까? 도와주세요 :(

도움이 되었습니까?

해결책

내 게시물을 다시 게시합니다 .NET의 문자열에서 Diacritic (악센트)을 어떻게 제거합니까?

이 방법은 Java에서 잘 작동합니다 (순전히 Diacritical Marks 일명 악센트를 제거하기 위해).

그것은 기본적으로 모든 악센트가있는 캐릭터를 자신의 암컷 대응 물로 변환 한 다음 결합 된 디아크리틱스를 변환합니다. 이제 Regex를 사용하여 Diacritics를 제거 할 수 있습니다.

import java.text.Normalizer;
import java.util.regex.Pattern;

public String deAccent(String str) {
    String nfdNormalizedString = Normalizer.normalize(str, Normalizer.Form.NFD); 
    Pattern pattern = Pattern.compile("\\p{InCombiningDiacriticalMarks}+");
    return pattern.matcher(nfdNormalizedString).replaceAll("");
}

다른 팁

그것은의 일부입니다 Apache Commons Lang Ver. 3.0.

org.apache.commons.lang3.StringUtils.stripAccents("Añ");

보고 An

또한 참조하십시오 http://www.drillio.com/en/software-development/java/removing-accents-diacritics-in-any-language/

"모두 변환"하려는 시도는 문제에 대한 잘못된 접근법입니다.

첫째, 당신은 당신이하려는 일의 한계를 이해해야합니다. 다른 사람들이 지적했듯이, Diacritics는 그 이유가 있습니다. 그것들은 자신의 의미 / 소리 등을 가진 그 언어의 알파벳에 본질적으로 독특한 문자입니다. 그 마크를 제거하는 것은 영어 단어로 임의의 문자를 대체하는 것과 동일합니다. 이것은 심지어 키릴 릭 언어와 아랍어와 같은 다른 스크립트 기반 텍스트를 고려하기 전에 단순히 영어로 "변환"할 수 없습니다.

만약 너라면 ~ 해야 하다, 어떤 이유로 든 캐릭터를 변환 한 다음, 먼저이 작업의 범위를 줄이기 위해이를 접근하는 유일한 현명한 방법입니다. 입력의 출처를 고려하십시오 - "서구 세계"에 대한 응용 프로그램을 코딩하는 경우 (어느 것도 좋은 문구를 사용하기 위해) 아랍어 문자를 구속해야 할 것 같지는 않습니다. 마찬가지로, 유니 코드 문자 세트에는 수백 개의 수학적 및 그림 상징이 포함되어 있습니다. 사용자가 직접 입력 할 수있는 방법은 없으므로 무시할 수 있다고 가정 할 수 있습니다.

이러한 논리적 단계를 수행하면 사전 기반 조회 / 교체 작업이 가능할 수있는 지점까지 가능한 문자 수를 줄일 수 있습니다. 그런 다음 사전을 만드는 소량의 약간 지루한 작업과 교체를 수행하는 사소한 작업이됩니다. 언어가 자바처럼 네이티브 유니 코드 문자를 지원하고 정적 구조를 올바르게 최적화하는 경우 그러한 찾기 및 대체는 맹목적으로 빠르게 경향이 있습니다.

이는 최종 사용자가 Diacritic 문자가 포함 된 서지 데이터를 검색 할 수 있도록 해야하는 응용 프로그램 작업 경험에서 비롯됩니다. 조회 배열 (우리의 경우와 마찬가지로)은 모든 서유럽 언어에 대한 모든 디아크리트 마크를 다루기 위해 생산하는 데 1 일이 걸렸을 것입니다.

"가족"을 "테마"로 바꾸는 인코딩은 효과적으로 무작위이며 관련된 유니 코드 코드 포인트의 정보로 설명 할 수있는 알고리즘을 따르지 않기 때문에이 알고리즘을 해결할 수있는 일반적인 방법은 없습니다.

유니 코드 문자의 매핑을 그들이 닮은 라틴 문자로 매핑해야합니다. 유니 코드 코드 포인트를 나타내는 실제 글리프에서 일부 스마트 머신 러닝 으로이 작업을 수행 할 수 있습니다. 그러나 나는 이것에 대한 노력이 그 매핑을 수동으로 구축하는 것보다 클 것이라고 생각합니다. 특히 매핑을 빌드 할 수있는 많은 예제가있는 경우.

명확히하기 위해 : 몇 가지 대체물은 실제로 유니 코드 데이터를 통해 해결 될 수 있지만 (다른 답변에서 알 수 있듯이) 일부 문자는 단순히 그들이 닮은 라틴 문자와 합리적인 연관성이 없습니다.

예 :

  • "" "(U+0452 키릴 소형 문자 dje)는"H "보다"d "와 더 관련이 있지만"H "를 나타내는 데 사용됩니다.
  • "0"(U+0166 뇌졸중이있는 라틴 대문자 T)은 "T"와 다소 관련되어 있지만 (이름에서 알 수 있듯이) "F"를 나타내는 데 사용됩니다.
  • "0"(U+0E04 태국 캐릭터 Kho Khwai)는 라틴 문자와 전혀 관련이 없으며 예에서는 "a"를 나타내는 데 사용됩니다.

원래 요청은 이미 답변되었습니다.

그러나 저는 Java의 라틴어/영어로 숯을 번역하기 위해 일반 음역 코드를 찾고있는 사람들에 대한 아래 답변을 게시하고 있습니다.

순진한 의미 : 최종 양식/대상 숯불로 번역 된 문자열은 원래 형식의 문자열처럼 들립니다. 우리가 모든 숯불을 라틴어 (영어 알파벳)로 번역하려면 ICU4 (Java의 ICU4J 라이브러리)가 작업을 수행합니다.

Java의 코드 스 니펫은 다음과 같습니다.

    import com.ibm.icu.text.Transliterator; //ICU4J library import

    public static String TRANSLITERATE_ID = "NFD; Any-Latin; NFC";
    public static String NORMALIZE_ID = "NFD; [:Nonspacing Mark:] Remove; NFC";

    /**
    * Returns the transliterated string to convert any charset to latin.
    */
    public static String transliterate(String input) {
        Transliterator transliterator = Transliterator.getInstance(TRANSLITERATE_ID + "; " + NORMALIZE_ID);
        String result = transliterator.transliterate(input);
        return result;
    }

"òéışöç-> oeisoc"를 변환해야 할 필요가 있다면,이를 시작점을 사용할 수 있습니다.

public class AsciiUtils {
    private static final String PLAIN_ASCII =
      "AaEeIiOoUu"    // grave
    + "AaEeIiOoUuYy"  // acute
    + "AaEeIiOoUuYy"  // circumflex
    + "AaOoNn"        // tilde
    + "AaEeIiOoUuYy"  // umlaut
    + "Aa"            // ring
    + "Cc"            // cedilla
    + "OoUu"          // double acute
    ;

    private static final String UNICODE =
     "\u00C0\u00E0\u00C8\u00E8\u00CC\u00EC\u00D2\u00F2\u00D9\u00F9"             
    + "\u00C1\u00E1\u00C9\u00E9\u00CD\u00ED\u00D3\u00F3\u00DA\u00FA\u00DD\u00FD" 
    + "\u00C2\u00E2\u00CA\u00EA\u00CE\u00EE\u00D4\u00F4\u00DB\u00FB\u0176\u0177" 
    + "\u00C3\u00E3\u00D5\u00F5\u00D1\u00F1"
    + "\u00C4\u00E4\u00CB\u00EB\u00CF\u00EF\u00D6\u00F6\u00DC\u00FC\u0178\u00FF" 
    + "\u00C5\u00E5"                                                             
    + "\u00C7\u00E7" 
    + "\u0150\u0151\u0170\u0171" 
    ;

    // private constructor, can't be instanciated!
    private AsciiUtils() { }

    // remove accentued from a string and replace with ascii equivalent
    public static String convertNonAscii(String s) {
       if (s == null) return null;
       StringBuilder sb = new StringBuilder();
       int n = s.length();
       for (int i = 0; i < n; i++) {
          char c = s.charAt(i);
          int pos = UNICODE.indexOf(c);
          if (pos > -1){
              sb.append(PLAIN_ASCII.charAt(pos));
          }
          else {
              sb.append(c);
          }
       }
       return sb.toString();
    }

    public static void main(String args[]) {
       String s = 
         "The result : È,É,Ê,Ë,Û,Ù,Ï,Î,À,Â,Ô,è,é,ê,ë,û,ù,ï,î,à,â,ô,ç";
       System.out.println(AsciiUtils.convertNonAscii(s));
       // output : 
       // The result : E,E,E,E,U,U,I,I,A,A,O,e,e,e,e,u,u,i,i,a,a,o,c
    }
}

JDK 1.6 은이 작업에 사용할 수있는 java.text.normalizer 클래스를 제공합니다.

예를 참조하십시오 여기

문자열 테스트 : Áâãäåæçèéêëìíîïðñòóôõöøùúúüý걸

테스트 :

  • 출력 Apache Commons Lang3 : aaaaaaæceeeeiiiiiiiznoooouøuuuyß
  • 출력 ICU4J : aaaaaaæceeeeiiiiiiiznoooouøuuuyß
  • 출력 주니 코드 : aaaaaaeeeeeeiiiiidnooooouuuuuususs (ý 및 다른 문제의 문제 문제)
  • 출력 Unidecode : aaaaaaeeeeeiiiiidnooooouuuuuuyss

마지막 선택이 최고입니다.

당신은 사용해 볼 수 있습니다 unidecode, 이는 a로 사용할 수 있습니다 루비 보석 그리고 a CPAN의 Perl 모듈. 본질적으로, 그것은 각 유니 코드 코드 포인트가 ASCII 문자 또는 문자열과 관련된 거대한 조회 테이블로 작동합니다.

이 편지가 당신이 전환하려는 라틴어 편지를 loke라는 주관적인 의견이기 때문에 원하는 것을 쉽게 또는 일반적인 방법은 없습니다. 그들은 실제로 라틴 문자처럼 표면적으로 보이도록하는 고유 한 이름과 소리가있는 별도의 문자입니다.

그 변환을 원한다면 라틴 문자를 바탕으로 라틴어 문자를 변환해야한다고 생각하는 라틴 문자를 기반으로 자신의 번역 테이블을 만들어야합니다.

(대규모 마크 만 제거하려면이 스레드에 몇 가지 답이 있습니다. .NET의 문자열에서 Diacritic (악센트)을 어떻게 제거합니까? 그러나 당신은 더 일반적인 문제를 설명합니다)

나는 파티에 늦었지만 오늘이 문제에 직면 한 후이 답변이 매우 좋다는 것을 알았습니다.

String asciiName = Normalizer.normalize(unicodeName, Normalizer.Form.NFD)
    .replaceAll("[^\\p{ASCII}]", "");

참조:https://stackoverflow.com/a/16283863

임의의 유니 코드를 ASCII로 "변환"하는 문제는 캐릭터의 의미가 문화에 의존한다는 것입니다. 예를 들어, 독일어를 사용하는 사람으로의“ß”는 "SS"로 전환되어야하며 영어를 사용하는 사람은 아마도 "B"로 변환 할 것입니다.

유니 코드에 동일한 글리프에 대한 여러 코드 포인트가 있다는 사실에도 추가하십시오.

결과는이 작업을 수행하는 유일한 방법은 각 유니 코드 문자와 변환하려는 ASCII 문자가있는 거대한 테이블을 만드는 것입니다. 요법을 형성하여 문자를 정규화하여 KD를 정규화하여 바로 가기를 할 수 있지만 모든 문자가 ASCII로 정규화되지는 않습니다. 또한 유니 코드는 글리프의 어떤 부분이 "악센트"인지 정의하지 않습니다.

다음은 다음을 수행하는 앱의 작은 발췌문입니다.

switch (c)
{
    case 'A':
    case '\u00C0':  //  À LATIN CAPITAL LETTER A WITH GRAVE
    case '\u00C1':  //  Á LATIN CAPITAL LETTER A WITH ACUTE
    case '\u00C2':  //  Â LATIN CAPITAL LETTER A WITH CIRCUMFLEX
    // and so on for about 20 lines...
        return "A";
        break;

    case '\u00C6'://  Æ LATIN CAPITAL LIGATURE AE
        return "AE";
        break;

    // And so on for pages...
}

다음 수업은 트릭을 수행합니다.

org.apache.lucene.analysis.miscellaneous.ASCIIFoldingFilter
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top