2010-07-20 5 views

답변

41

다른 유니 코드 인코딩을 사용하는 경우에도 유니 코드 문자열이 동일한 지 비교할 수 있는지 확인합니다. 유니 코드 표준 Annex #15에서

:

는 기본적으로 유니 코드 정규화 알고리즘은 지정된 순서에있는 모든 조합 마크를두고, 그리고 유니 코드 표준화 양식 중 하나에 각각의 문자열을 변환하는 분해 및 구성에 대한 규칙을 사용합니다. 변환 된 문자열의 이진 비교는 동등성을 결정합니다.

+0

우수 답변. 제공된 링크가 좋습니다! 재미있는 예를 보려면 – GeReV

5

이 링크는 좋은 설명이있다 : 나는 추측 할 수있는 일부터

http://unicode.org/reports/tr15/#Norm_Forms

는 그것 때문에 당신은 평등에 대한 두 개의 유니 코드 문자열을 비교할 수 있습니다.

48

양식 C와 양식 D의 차이점은 악센트가있는 문자가 어떻게 표시되는지입니다. 양식 C는 악센트 부호가있는 단일 코드 포인트를 사용하고 양식 D는 문자와 악센트로 문자를 구분합니다.

예를 들어 "à"는 코드 포인트 224 ("중표가있는 라틴 소문자") 또는 코드 포인트 97 ("라틴 소문자 A") 다음에 코드 포인트 786 ("중괄호 악센트 결합")이 될 수 있습니다.

부작용은 "악센트 제거"방법을 쉽게 만들 수 있다는 것입니다.

public static string RemoveAccents(string input) 
    { 
     return new string(
      input 
      .Normalize(System.Text.NormalizationForm.FormD) 
      .ToCharArray() 
      .Where(c => CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark) 
      .ToArray()); 
     // the normalization to FormD splits accented letters in accents+letters 
     // the rest removes those accents (and other non-spacing characters) 
    } 
+2

+1. – GeReV

6

유니에서, (구성) 캐릭터 고유 코드 포인트 또는 기본 문자 및 악센트 이루어진 코드 포인트의 시퀀스를 가질 수 있습니다.

Wikipedia은 예를 들어 베트남어 ế (U + 1EBF) 및 그 분해 된 순서 U + 0065 (e) U + 0302 (곡절 악센트) U + 0301 (악센트)로 나열됩니다.

string.Normalize()는 4 개의 일반 양식 사이에서 유니 코드로 문자열을 코딩 할 수 있습니다.