Сравнение и сортировка данных для конкретного языка и региона
Соглашения для сортировки и упорядочения данных зависят от региональных параметров. Например, порядок сортировки может зависеть или не зависеть от регистра символов. Он может быть основан на фонетике или на визуальном представлении символов. В языках Восточной Азии символы сортируются по штрихам и корням идеограмм. Сортировка также зависит от того, какой порядок используют региональные параметры для алфавита. Например, датский языке есть символ «Æ», он действует в алфавите после буквы «Z». Международные приложения должны поддерживать сравнениеи сортировку данных в зависимости правил характерных для конкретоного языка и региона.
Примечание
В некоторых сценариях, учитывающего язык и региональные параметры расширение функциональности нежелательно.Дополнительные сведения о том, когда и как проводить операции, не зависящие от языка и региона, см. в разделе Строковые операции, не зависящие от языка и региона.
Сравнение строк
Класс CompareInfo предоставляет методы для сравнения строк, зависящих от языка и региона. Класс CultureInfo обладает свойством CompareInfo, которое получает экземпляр класса CompareInfo. Объект CompareInfo определяет порядок сравнения и сортировки строк для конкретного языка и региона. Метод String.Compare использует сведения в объекте CompareInfo региональных параметров для сравнения строк.
В следующем примере показано, как метод String.Compare возвращает две строки ("apple" и "Æble") по-разному, в зависимости от региональных параметров, используемых для сравнения. Сначала свойство System.Threading.Thread.CurrentThread.CurrentCulture установлено в da-DK региональных параметров Дании (датский язык). В датском языке символ "Æ" рассматривается как отдельная буква и стоит в алфавите после буквы "Z". Поэтому строка "Æble" больше, чем "apple" для региональных параметров Дании (датский язык). Далее свойство System.Threading.Thread.CurrentThread.CurrentCulture установлено в en-US для региональных параметров Соединенных Штатов (английский язык), английский язык обрабатывает символ "Æ" как специальный символ и сортирует его так, что он располагается в алфавите перед буквой "А". Поэтому строка "Æble" меньше "apple" для региональных параметров Соединенных Штатов (английский язык).
Imports System.Globalization
Imports System.Threading
Public Class TestClass
Public Shared Sub Main()
Dim str1 As String = "Apple"
Dim str2 As String = "Æble"
' Set the current culture to Danish in Denmark.
Thread.CurrentThread.CurrentCulture = New CultureInfo("da-DK")
Dim result1 As Integer = [String].Compare(str1, str2)
Console.WriteLine("When the CurrentCulture is ""da-DK"",")
Console.WriteLine("the result of comparing_{0} with {1} is: {2}",
str1, str2, result1)
' Set the current culture to English in the U.S.
Thread.CurrentThread.CurrentCulture = New CultureInfo("en-US")
Dim result2 As Integer = [String].Compare(str1, str2)
Console.WriteLine("When the CurrentCulture is""en-US"",")
Console.WriteLine("the result of comparing {0} with {1} is: {2}",
str1, str2,result2)
End Sub
End Class
' The example displays the following output:
' When the CurrentCulture is "da-DK",
' the result of comparing Apple with Æble is: -1
'
' When the CurrentCulture is "en-US",
' the result of comparing Apple with Æble is: 1
using System;
using System.Globalization;
using System.Threading;
public class CompareStringSample
{
public static void Main()
{
string str1 = "Apple";
string str2 = "Æble";
// Sets the CurrentCulture to Danish in Denmark.
Thread.CurrentThread.CurrentCulture = new CultureInfo("da-DK");
// Compares the two strings.
int result1 = String.Compare(str1, str2);
Console.WriteLine("\nWhen the CurrentCulture is \"da-DK\",\nthe " +
"result of comparing {0} with {1} is: {2}", str1, str2,
result1);
// Sets the CurrentCulture to English in the U.S.
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
// Compares the two strings.
int result2 = String.Compare(str1, str2);
Console.WriteLine("\nWhen the CurrentCulture is \"en-US\",\nthe " +
"result of comparing {0} with {1} is: {2}", str1, str2,
result2);
}
}
// The example displays the following output:
// When the CurrentCulture is "da-DK",
// the result of comparing Apple with Æble is: -1
//
// When the CurrentCulture is "en-US",
// the result of comparing Apple with Æble is: 1
Дополнительные сведения о сравнении строк см. в разделе Сравнения строк.
Использование альтернативного порядка сортировки
Для некоторых языков и регионов поддерживается несколько порядков сортировки. Например, (китайский — КНР) язык zh-cn поддерживает 2 порядок сортировки: (по умолчанию) и по числу штрихов. При создании объекта CultureInfo с использованием имени языка и региональных параметров, например "zh-CN", применяется порядок сортировки по умолчанию. Чтобы указать другой порядок сортировки, создайте объект CultureInfo путем вызова конструкторов CultureInfo.CultureInfo(Int32) или CultureInfo.CultureInfo(Int32, Boolean) и использования идентификатора другого порядка сортировки, а затем получите объект CompareInfo из свойства CompareInfo для использования при сравнении строк. Также можно создать объект CompareInfo непосредственно с помощью метода CompareInfo.GetCompareInfo и указать идентификатор для альтернативного порядка сортировки.
В приведенной ниже таблице перечислены языки и региональные параметры, в которых поддерживается альтернативный порядок сортировки, и идентификаторы для порядка сортировки по умолчанию и альтернативного порядка сортировки.
Название языка и региональных параметров |
Язык и региональные параметры |
Название и идентификатор для типа сортировки по умолчанию |
Название и идентификатор для альтернативного типа сортировки |
---|---|---|---|
es-ES |
Испанский (Испания) |
Международная: 0x00000C0A |
Традиционная: 0x0000040A |
zh-TW |
Китайский (Тайвань) |
По числу штрихов: 0x00000404 |
Бопомофо: 0x00030404 |
zh-CN |
Китайский (КНР) |
Произношение: 0x00000804 |
По числу штрихов: 0x00020804 |
zh-HK |
Китайский (Гонконг) |
По числу штрихов: 0x00000c04 |
По числу штрихов: 0x00020c04 |
zh-SG |
Китайский (Сингапур) |
Произношение: 0x00001004 |
По числу штрихов: 0x00021004 |
zh-MO |
Китайский (Макао) |
Произношение: 0x00001404 |
По числу штрихов: 0x00021404 |
ja-JP |
Японский (Япония) |
По умолчанию: 0x00000411 |
Юникод: 0x00010411 |
ko-KR |
Корейский (Корея) |
По умолчанию: 0x00000412 |
Корейский Xwansung – Юникод: 0x00010412 |
de-DE |
Немецкий (Германия) |
Словарь: 0x00000407 |
Сортировка по телефонной книге DIN: 0x00010407 |
hu-HU |
Венгерский (Венгрия) |
По умолчанию: 0x0000040e |
Техническая сортировка: 0x0001040e |
ka-GE |
Грузинский (Грузия) |
Традиционная: 0x00000437 |
Современная сортировка: 0x00010437 |
Поиск строк
Можно вызвать перегруженный метод CompareInfo.IndexOf для извлечения индекса символа или подстроки внутри определенной строки. Метод возвращает -1, если не найден символ или подстрока. Поиск отдельного символа, перегруженных методов IndexOf, принимающих параметр типа CompareOptions могут работать иначе, чем сравнения перегруженные версии методов, не принимающих этот параметр. Перегрузки методов без этого параметра выполняют чувствительный к региональным параметрам и регистру поиск. Например, символ является составным знаком Юникод, например лигатурой "Æ" (\u00C6), для некоторых языков и регионов такой символ можно считать эквивалентным любому вхождению его компонентов в правильной последовательности, например "AE" (U+0041, U+0045). Для выполнения (зависящего от региональных параметров) поиска по порядковым номерам точных значений Юникода, используйте одну из перегрузок CompareInfo.IndexOf, которая принимает параметр типа CompareOptions и устанавливает значение параметра равным Ordinal.
Также можно вызвать перегрузки метода String.IndexOf, которые выполняют поиск символа для поиска по порядковым номерам (без учета языка и региональных параметров). Необходимо помнить, что перегрузки этого метода, предназначенные для поиска строк, выполняют поиск с учетом культурной среды.
Следующий пример показывает разницу между результатами, возвращаемыми методом CompareInfo.IndexOf в зависимости от языка и региона. Пример создает объект CultureInfo для региональных параметров Дании (датский язык) и Соединенных Штатов (английский язык) и использует перегрузку метода CompareInfo.IndexOf для поиска символа "æ" в строках "æble" и "aeble". Для региональных параметров Дании (датский язык), метод CompareInfo.IndexOf(String, Char) и метод CompareInfo.IndexOf(String, Char, CompareOptions), имеющий параметр сравнения CompareOptions.Ordinal, возвращают одно и то же значение для каждой строки. Это указывает на то, что символ "æ" рассматривается как эквивалентный только для значения Юникода \u00E6. Для региональных параметров Соединенных Штатов (английский язык) две перегрузки возвращают различные результаты при поиске "æ" в строке "aeble". Это указывает, что при сравнении с учетом языка и региона, производимом при помощи метода CompareInfo.IndexOf(String, Char), символ "æ" принимается равным его компонентам "a" и "e".
Imports System.Globalization
Imports System.Threading
Public Class Example
Public Shared Sub Main()
Dim str1 As String = "æble"
Dim str2 As String = "aeble"
Dim find As Char = "æ"c
' Create CultureInfo objects representing the Danish (Denmark)
' and English (United States) cultures.
Dim cultures() As CultureInfo = { CultureInfo.CreateSpecificCulture("da-DK"),
CultureInfo.CreateSpecificCulture("en-US") }
For Each ci In cultures
Thread.CurrentThread.CurrentCulture = ci
Dim result1 As Integer = ci.CompareInfo.IndexOf(str1, find)
Dim result2 As Integer = ci.CompareInfo.IndexOf(str2, find)
Dim result3 As Integer = ci.CompareInfo.IndexOf(str1, find, _
CompareOptions.Ordinal)
Dim result4 As Integer = ci.CompareInfo.IndexOf(str2, find, _
CompareOptions.Ordinal)
Console.WriteLine("The current culture is {0}",
CultureInfo.CurrentCulture.Name)
Console.WriteLine()
Console.WriteLine(" CompareInfo.IndexOf(string, char) method:")
Console.WriteLine(" Position of {0} in the string {1}: {2}",
find, str1, result1)
Console.WriteLine()
Console.WriteLine(" CompareInfo.IndexOf(string, char) method:")
Console.WriteLine(" Position of {0} in the string {1}: {2}",
find, str2, result2)
Console.WriteLine()
Console.WriteLine(" CompareInfo.IndexOf(string, char, CompareOptions.Ordinal) method")
Console.WriteLine(" Position of {0} in the string {1}: {2}",
find, str1, result3)
Console.WriteLine()
Console.WriteLine(" CompareInfo.IndexOf(string, char, CompareOptions.Ordinal) method")
Console.WriteLine(" Position of {0} in the string {1}: {2}",
find, str2, result4)
Console.WriteLine()
Next
End Sub
End Class
' The example displays the following output:
' The current culture is da-DK
'
' CompareInfo.IndexOf(string, char) method:
' Position of æ in the string æble: 0
'
' CompareInfo.IndexOf(string, char) method:
' Position of æ in the string aeble: -1
'
' CompareInfo.IndexOf(string, char, CompareOptions.Ordinal) method
' Position of æ in the string æble: 0
'
' CompareInfo.IndexOf(string, char, CompareOptions.Ordinal) method
' Position of æ in the string aeble: -1
'
' The current culture is en-US
'
' CompareInfo.IndexOf(string, char) method:
' Position of æ in the string æble: 0
'
' CompareInfo.IndexOf(string, char) method:
' Position of æ in the string aeble: 0
'
' CompareInfo.IndexOf(string, char, CompareOptions.Ordinal) method
' Position of æ in the string æble: 0
'
' CompareInfo.IndexOf(string, char, CompareOptions.Ordinal) method
' Position of æ in the string aeble: -1
using System;
using System.Globalization;
using System.Threading;
public class Example
{
public static void Main()
{
string str1 = "æble";
string str2 = "aeble";
char find = 'æ';
// Create CultureInfo objects representing the Danish (Denmark)
// and English (United States) cultures.
CultureInfo[] cultures = { CultureInfo.CreateSpecificCulture("da-DK"),
CultureInfo.CreateSpecificCulture("en-US") };
foreach (var ci in cultures) {
Thread.CurrentThread.CurrentCulture = ci;
int result1 = ci.CompareInfo.IndexOf(str1, find);
int result2 = ci.CompareInfo.IndexOf(str2, find);
int result3 = ci.CompareInfo.IndexOf(str1, find,
CompareOptions.Ordinal);
int result4 = ci.CompareInfo.IndexOf(str2, find,
CompareOptions.Ordinal);
Console.WriteLine("\nThe current culture is {0}",
CultureInfo.CurrentCulture.Name);
Console.WriteLine("\n CompareInfo.IndexOf(string, char) method:");
Console.WriteLine(" Position of {0} in the string {1}: {2}",
find, str1, result1);
Console.WriteLine("\n CompareInfo.IndexOf(string, char) method:");
Console.WriteLine(" Position of {0} in the string {1}: {2}",
find, str2, result2);
Console.WriteLine("\n CompareInfo.IndexOf(string, char, CompareOptions.Ordinal) method");
Console.WriteLine(" Position of {0} in the string {1}: {2}",
find, str1, result3);
Console.WriteLine("\n CompareInfo.IndexOf(string, char, CompareOptions.Ordinal) method");
Console.WriteLine(" Position of {0} in the string {1}: {2}",
find, str2, result4);
Console.WriteLine();
}
}
}
// The example displays the following output
// The current culture is da-DK
//
// CompareInfo.IndexOf(string, char) method:
// Position of æ in the string æble: 0
//
// CompareInfo.IndexOf(string, char) method:
// Position of æ in the string aeble: -1
//
// CompareInfo.IndexOf(string, char, CompareOptions.Ordinal) method
// Position of æ in the string æble: 0
//
// CompareInfo.IndexOf(string, char, CompareOptions.Ordinal) method
// Position of æ in the string aeble: -1
//
//
// The current culture is en-US
//
// CompareInfo.IndexOf(string, char) method:
// Position of æ in the string æble: 0
//
// CompareInfo.IndexOf(string, char) method:
// Position of æ in the string aeble: 0
//
// CompareInfo.IndexOf(string, char, CompareOptions.Ordinal) method
// Position of æ in the string æble: 0
//
// CompareInfo.IndexOf(string, char, CompareOptions.Ordinal) method
// Position of æ in the string aeble: -1
Сортировка строк
Можно использовать некоторые из перегруженных методов Array.Sort для сортировки массивов, основанных на текущих региональных параметров. В следующем примере создается массив из трех строк. Сначала задается свойство System.Threading.Thread.CurrentThread.CurrentCulture для en-US и вызывается метод Array.Sort(Array). Полученный в результате порядок сортировки основан на правилах сортировки для языка и региональных параметров Английский (США). Затем примере задает свойство System.Threading.Thread.CurrentThread.CurrentCulture для da-DK и вызывает метод Array.Sort снова. Обратите внимание, что теперь порядок сортировки отличается от результата для языка и региональных параметров "en-US", так как используются правило сортировки данных для Дании (датский язык).
Imports System.Globalization
Imports System.IO
Imports System.Threading
Public Class TextToFile
Public Shared Sub Main()
' Creates and initializes a new array to store
' these date/time objects.
Dim stringArray() As String = { "Apple", "Æble", "Zebra"}
' Displays the values of the array.
Console.WriteLine("The original string array:")
PrintIndexAndValues(stringArray)
' Set the CurrentCulture to "en-US".
Thread.CurrentThread.CurrentCulture = New CultureInfo("en-US")
' Sort the values of the Array.
Array.Sort(stringArray)
' Display the values of the array.
Console.WriteLine("After sorting for the ""en-US"" culture:")
PrintIndexAndValues(stringArray)
' Set the CurrentCulture to "da-DK".
Thread.CurrentThread.CurrentCulture = New CultureInfo("da-DK")
' Sort the values of the Array.
Array.Sort(stringArray)
' Displays the values of the Array.
Console.WriteLine("After sorting for the culture ""da-DK"":")
PrintIndexAndValues(stringArray)
End Sub
Public Shared Sub PrintIndexAndValues(myArray() As String)
For i As Integer = myArray.GetLowerBound(0) To myArray.GetUpperBound(0)
Console.WriteLine("[{0}]: {1}", i, myArray(i))
Next
Console.WriteLine()
End Sub
End Class
' The example displays the following output:
' The original string array:
' [0]: Apple
' [1]: Æble
' [2]: Zebra
'
' After sorting for the "en-US" culture:
' [0]: Æble
' [1]: Apple
' [2]: Zebra
'
' After sorting for the culture "da-DK":
' [0]: Apple
' [1]: Zebra
' [2]: Æble
using System;
using System.Globalization;
using System.Threading;
public class ArraySort
{
public static void Main(String[] args)
{
// Create and initialize a new array to store the strings.
string[] stringArray = { "Apple", "Æble", "Zebra"};
// Display the values of the array.
Console.WriteLine( "The original string array:");
PrintIndexAndValues(stringArray);
// Set the CurrentCulture to "en-US".
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
// Sort the values of the array.
Array.Sort(stringArray);
// Display the values of the array.
Console.WriteLine("After sorting for the culture \"en-US\":");
PrintIndexAndValues(stringArray);
// Set the CurrentCulture to "da-DK".
Thread.CurrentThread.CurrentCulture = new CultureInfo("da-DK");
// Sort the values of the Array.
Array.Sort(stringArray);
// Display the values of the array.
Console.WriteLine("After sorting for the culture \"da-DK\":");
PrintIndexAndValues(stringArray);
}
public static void PrintIndexAndValues(string[] myArray)
{
for (int i = myArray.GetLowerBound(0); i <=
myArray.GetUpperBound(0); i++ )
Console.WriteLine("[{0}]: {1}", i, myArray[i]);
Console.WriteLine();
}
}
// The example displays the following output:
// The original string array:
// [0]: Apple
// [1]: Æble
// [2]: Zebra
//
// After sorting for the "en-US" culture:
// [0]: Æble
// [1]: Apple
// [2]: Zebra
//
// After sorting for the culture "da-DK":
// [0]: Apple
// [1]: Zebra
// [2]: Æble
Использование ключей сортировки
Платформа .NET Framework использует ключи сортировки для поддержки операций сортировки, зависящих от региональных параметров. Каждому знаку в строке ставится в соответствие несколько категорий весовых коэффициентов для сортировки, в том числе весовые коэффициенты, алфавитные, регистра и диакритические. Ключ сортировки предоставляет хранилище этих весовых коэффициентов для конкретной строки. Например, ключ сортировки может содержать строку с алфавитными весами, после которой идет строка с регистровыми весами и т. д. Дополнительные сведения о ключах сортировки см. на Стандарт юникод №10 технический: Алгоритм сортировки юникода.
В платформе .NET Framework класс SortKey сопоставляет строкам свои ключи сортировки. Чтобы создать требуемый ключ сортировки для указанной строки, можно использовать метод CompareInfo.GetSortKey. Результат последовательности байтов, которые могут различаться в зависимости от свойства CurrentCulture и заданного значения CompareOptions. Например, если указать значение CompareOptions.IgnoreCase при создании ключа сортировки, операция сравнения строк с помощью ключа сортировки будет являться чувствительной к регистру.
После создания ключ сортировки для строки, можно передать его в качестве параметра метода, реализованного в классе SortKey. Метод SortKey.Compare позволяет сравнивать ключи сортировки. Поскольку метод осуществляет побайтовое сравнение, при его работе обеспечивается более высокая скорость по сравнению с методом String.Compare. Если приложение выполняет большое число операций сортировки, можно повысить его производительность за счет создания и хранения ключей сортировки для всех строк, которые он использует. При выполнении операций сортировки или сравнения в приложении будут использоваться ключи сортировки вместо строк.
В следующем примере создаются ключи сортировки для двух строк (str1 и str2) , где свойство CurrentCulture является множеством для da-DK. Выполняется сравнение двух строк с помощью метода SortKey.Compare с последующим выводом результата на экран. Метод возвращает отрицательное целое число, если str1 меньше, чем str2, ноль, если str1 и str2 равны, или положительное целое число, если str1 больше, чем str2. Затем пример задает свойство System.Threading.Thread.CurrentThread.CurrentCulture для en-US и создает новые ключи сортировки для тех же строк. Пример сравнивает ключи сортировки и выводит результаты. Обратите внимание, что результаты сортировки отличаются в зависимости от текущих региональных параметров. Несмотря на то, что результаты приведенного ниже примера идентичны результатам в примере Сравнение строк, приведенном ранее в этом разделе, метод SortKey.Compare быстрее, чем метод String.Compare.
Imports System.Globalization
Imports System.Threading
Public Class SortKeySample
Public Shared Sub Main()
Dim str1 As [String] = "Apple"
Dim str2 As [String] = "Æble"
' Set the CurrentCulture to "da-DK".
Dim dk As New CultureInfo("da-DK")
Thread.CurrentThread.CurrentCulture = dk
' Create a culturally sensitive sort key for str1.
Dim sc1 As SortKey = dk.CompareInfo.GetSortKey(str1)
' Create a culturally sensitive sort key for str2.
Dim sc2 As SortKey = dk.CompareInfo.GetSortKey(str2)
' Compare the two sort keys and display the results.
Dim result1 As Integer = SortKey.Compare(sc1, sc2)
Console.WriteLine("When the current culture is ""da-DK"",")
Console.WriteLine("the result of comparing {0} with {1} is: {2}",
str1, str2, result1)
Console.WriteLine()
' Set the CurrentCulture to "en-US".
Dim enus As New CultureInfo("en-US")
Thread.CurrentThread.CurrentCulture = enus
' Create a culturally sensitive sort key for str1.
Dim sc3 As SortKey = enus.CompareInfo.GetSortKey(str1)
' Create a culturally sensitive sort key for str1.
Dim sc4 As SortKey = enus.CompareInfo.GetSortKey(str2)
' Compare the two sort keys and display the results.
Dim result2 As Integer = SortKey.Compare(sc3, sc4)
Console.WriteLine("When the CurrentCulture is ""en-US"",")
Console.WriteLine("the result of comparing {0} with {1} is: {2}",
str1, str2, result2)
End Sub
End Class
' The example displays the following output:
' When the current culture is "da-DK",
' the result of comparing Apple with Æble is: -1
'
' When the CurrentCulture is "en-US",
' the result of comparing Apple with Æble is: 1
using System;
using System.Threading;
using System.Globalization;
public class SortKeySample
{
public static void Main(String[] args)
{
String str1 = "Apple";
String str2 = "Æble";
// Set the CurrentCulture to "da-DK".
CultureInfo dk = new CultureInfo("da-DK");
Thread.CurrentThread.CurrentCulture = dk;
// Create a culturally sensitive sort key for str1.
SortKey sc1 = dk.CompareInfo.GetSortKey(str1);
// Create a culturally sensitive sort key for str2.
SortKey sc2 = dk.CompareInfo.GetSortKey(str2);
// Compare the two sort keys and display the results.
int result1 = SortKey.Compare(sc1, sc2);
Console.WriteLine("When the CurrentCulture is \"da-DK\",");
Console.WriteLine("the result of comparing {0} with {1} is: {2}\n",
str1, str2, result1);
// Set the CurrentCulture to "en-US".
CultureInfo enus = new CultureInfo("en-US");
Thread.CurrentThread.CurrentCulture = enus ;
// Create a culturally sensitive sort key for str1.
SortKey sc3 = enus.CompareInfo.GetSortKey(str1);
// Create a culturally sensitive sort key for str1.
SortKey sc4 = enus.CompareInfo.GetSortKey(str2);
// Compare the two sort keys and display the results.
int result2 = SortKey.Compare(sc3, sc4);
Console.WriteLine("When the CurrentCulture is \"en-US\",");
Console.WriteLine("the result of comparing {0} with {1} is: {2}",
str1, str2, result2);
}
}
// The example displays the following output:
// When the CurrentCulture is "da-DK",
// the result of comparing Apple with Æble is: -1
//
// When the CurrentCulture is "en-US",
// the result of comparing Apple with Æble is: 1
Нормализация
Можно привести строки к верхнему или нижнему регистру перед их сортировкой. Правила для сортировки и преобразования регистра строк являются зависимыми от языка, и правила различаются даже внутри языков, основанных на латинице. Только несколько языков (включая английский) обеспечивают совпадение порядка сортировки с порядком кодовых точек (например A [65] идет перед B [66]). Поэтому не следует полагаться на кодовые точки для выполнения точной сортировки и сравнения строк.
Платформа .NET Framework поддерживает все формы нормализации Юникода, а не предоставляет определенную форму нормализации. Пользователь отвечает за выбор подходящей нормализация для приложений.
Нормализация строки Дополнительные сведения о см. в разделе «по» в разделе класса String.
См. также
Основные понятия
Строковые операции, не зависящие от языка и региональных параметров