Что делает .NET String.Normalize? - PullRequest
66 голосов
/ 20 июля 2010

В статье MSDN о String.Normalize просто говорится:

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

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

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

Ответы [ 4 ]

61 голосов
/ 20 июля 2010

Одно из различий между формой 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)
    }
49 голосов
/ 20 июля 2010

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

Из стандарта Unicode Приложение № 15 :

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

6 голосов
/ 20 июля 2010

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

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

строка. Нормализация () преобразует между 4 нормальными формами aСтрока может быть закодирована в Unicode.

5 голосов
/ 20 июля 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...