Что делает .NET String.Normalize?
MSDN-статья о String.Normalize проста:
Возвращает новую строку, двоичное представление которой находится в определенной форме нормализации Unicode.
И иногда ссылаясь на "форму нормализации Unicode C."
Мне просто интересно, что это значит? Как эта функция полезна в реальных жизненных ситуациях?
Ответы
Ответ 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
Из того, что я могу предположить, его можно сравнить две строки юникода для равенства.