Що робить .NET String.Normalize?


75

Стаття MSDN про String.Normalize стверджує просто:

Повертає новий рядок, двійкове представлення якого знаходиться у певній формі нормалізації Unicode.

І іноді посилаючись на "форму нормалізації Unicode C."

Мені просто цікаво, що це означає? Чим корисна ця функція в реальних життєвих ситуаціях?


2
+1 приємне запитання, мені цікаво про це.
Адам Голдсворт,

Відповіді:


52

Це гарантує, що рядки Unicode можна порівнювати для рівності (навіть якщо вони використовують різні кодування Unicode).

Зі стандартного додатку Unicode № 15 :

По суті, алгоритм нормалізації Unicode розміщує всі позначення комбінування у визначеному порядку та використовує правила розкладання та композиції для перетворення кожного рядка в одну з форм нормалізації Unicode. Потім бінарне порівняння перетворених рядків визначить еквівалентність.


Відмінна відповідь. Надане посилання чудове!
GeReV

73

Одна різниця між формою 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 letters+accents
    // the rest removes those accents (and other non-spacing characters)
    // and creates a new string from the remaining chars
}

6

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

Вікіпедія перераховує як приклад в’єтнамський ế (U + 1EBF) та його розкладену послідовність U + 0065 (e) U + 0302 (циркумфлексний акцент) U + 0301 (гострий акцент).

string.Normalize () перетворює між 4 нормальними формами рядок може кодуватися в Unicode.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.