IT TIP

.NET의 String.Normalize는 무엇을합니까?

itqueen 2020. 11. 4. 21:04
반응형

.NET의 String.Normalize는 무엇을합니까?


String.Normalize에 대한 MSDN 기사는 다음과 같이 간단히 설명합니다.

바이너리 표현이 특정 유니 코드 정규화 형식 인 새 문자열을 반환합니다.

때때로 "유니 코드 정규화 형식 C"를 참조합니다.

그게 무슨 뜻일까요? 이 기능은 실제 상황에서 어떻게 유용합니까?


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

Unicode Standard Annex # 15에서 :

기본적으로 유니 코드 정규화 알고리즘은 모든 결합 마크를 지정된 순서로 배치하고 분해 및 구성 규칙을 사용하여 각 문자열을 유니 코드 정규화 형식 중 하나로 변환합니다. 변환 된 문자열의 이진 비교는 동등성을 결정합니다.


C 형과 D 형의 한 가지 차이점은 악센트가있는 문자가 어떻게 표현되는지입니다. C 형은 악센트가있는 단일 문자 코드 포인트를 사용하는 반면, D 형은이를 문자와 악센트로 구분합니다.

예를 들어 "à"는 코드 포인트 224 ( "라틴 소문자 A와 억음") 또는 코드 포인트 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)
    }

유니 코드에서 (구성된) 문자는 고유 한 코드 포인트 또는 기본 문자와 그 액센트로 구성된 일련의 코드 포인트를 가질 수 있습니다.

위키 백과 에는 베트남어 ế (U + 1EBF) 및 분해 된 시퀀스 U + 0065 (e) U + 0302 (곡절 악센트) U + 0301 (예음 악센트)가 나열되어 있습니다.

string.Normalize ()는 문자열을 유니 코드로 코딩 할 수있는 4 가지 일반 형식 사이에서 변환합니다.


이 링크에는 좋은 설명이 있습니다.

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

내가 추측 할 수있는 바에 따르면 두 개의 유니 코드 문자열을 비교할 수 있습니다.

참고 URL : https://stackoverflow.com/questions/3288114/what-does-nets-string-normalize-do

반응형