Подтвердить что ты не робот

Что делает .NET String.Normalize?

MSDN-статья о String.Normalize проста:

Возвращает новую строку, двоичное представление которой находится в определенной форме нормализации Unicode.

И иногда ссылаясь на "форму нормализации Unicode C."

Мне просто интересно, что это значит? Как эта функция полезна в реальных жизненных ситуациях?

4b9b3361

Ответ 1

Он гарантирует, что строки unicode можно сравнить для равенства (даже если они используют разные кодировки в кодировке Unicode).

Из Unicode Standard Приложение №15:

По сути, Алгоритм нормализации Unicode помещает все сочетания меток в заданном порядке и использует правила для декомпозиции и композиции для преобразования каждой строки в одну из форм нормализации Unicode. Затем двоичное сравнение преобразованных строк будет определять эквивалентность.

Ответ 2

Одно из различий между формой C и формой D заключается в том, как представлены буквы с акцентами: в форме C используется один кодовый пример с буквой с акцентом, а форма D разделяет это на букву и акцент.

Побочным эффектом является то, что это позволяет легко создать метод "удалить акценты".

    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)
    }

Ответ 3

В Unicode символ (скомпонованный) может иметь либо уникальную кодовую точку, либо последовательность кодовых точек, состоящую из базового символа и его акцентов.

Wikipedia перечисляет в качестве примера вьетнамский ế (U + 1EBF) и его разложенную последовательность U + 0065 (e) U + 0302 (circumflex акцент) U + 0301 (острый акцент).

string.Normalize() преобразует между 4 нормальными формами, строка может быть закодирована в Юникоде.

Ответ 4

Эта ссылка имеет хорошее объяснение:

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

Из того, что я могу предположить, его можно сравнить две строки юникода для равенства.