String.Normalize Metoda
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Zwraca nowy ciąg, którego reprezentacja binarna znajduje się w określonej postaci normalizacji Unicode.
Przeciążenia
| Nazwa | Opis |
|---|---|
| Normalize() |
Zwraca nowy ciąg, którego wartość tekstowa jest taka sama jak ten ciąg, ale którego reprezentacja binarna znajduje się w postaci normalizacji Unicode C. |
| Normalize(NormalizationForm) |
Zwraca nowy ciąg, którego wartość tekstowa jest taka sama jak ten ciąg, ale którego reprezentacja binarna znajduje się w określonej postaci normalizacji Unicode. |
Przykłady
Poniższy przykład normalizuje ciąg do każdego z czterech formularzy normalizacji, potwierdza, że ciąg został znormalizowany do określonego formularza normalizacji, a następnie wyświetla listę punktów kodu w znormalizowanym ciągu.
using System;
using System.Text;
class Example
{
public static void Main()
{
// Character c; combining characters acute and cedilla; character 3/4
string s1 = new String( new char[] {'\u0063', '\u0301', '\u0327', '\u00BE'});
string s2 = null;
string divider = new String('-', 80);
divider = String.Concat(Environment.NewLine, divider, Environment.NewLine);
Show("s1", s1);
Console.WriteLine();
Console.WriteLine("U+0063 = LATIN SMALL LETTER C");
Console.WriteLine("U+0301 = COMBINING ACUTE ACCENT");
Console.WriteLine("U+0327 = COMBINING CEDILLA");
Console.WriteLine("U+00BE = VULGAR FRACTION THREE QUARTERS");
Console.WriteLine(divider);
Console.WriteLine("A1) Is s1 normalized to the default form (Form C)?: {0}",
s1.IsNormalized());
Console.WriteLine("A2) Is s1 normalized to Form C?: {0}",
s1.IsNormalized(NormalizationForm.FormC));
Console.WriteLine("A3) Is s1 normalized to Form D?: {0}",
s1.IsNormalized(NormalizationForm.FormD));
Console.WriteLine("A4) Is s1 normalized to Form KC?: {0}",
s1.IsNormalized(NormalizationForm.FormKC));
Console.WriteLine("A5) Is s1 normalized to Form KD?: {0}",
s1.IsNormalized(NormalizationForm.FormKD));
Console.WriteLine(divider);
Console.WriteLine("Set string s2 to each normalized form of string s1.");
Console.WriteLine();
Console.WriteLine("U+1E09 = LATIN SMALL LETTER C WITH CEDILLA AND ACUTE");
Console.WriteLine("U+0033 = DIGIT THREE");
Console.WriteLine("U+2044 = FRACTION SLASH");
Console.WriteLine("U+0034 = DIGIT FOUR");
Console.WriteLine(divider);
s2 = s1.Normalize();
Console.Write("B1) Is s2 normalized to the default form (Form C)?: ");
Console.WriteLine(s2.IsNormalized());
Show("s2", s2);
Console.WriteLine();
s2 = s1.Normalize(NormalizationForm.FormC);
Console.Write("B2) Is s2 normalized to Form C?: ");
Console.WriteLine(s2.IsNormalized(NormalizationForm.FormC));
Show("s2", s2);
Console.WriteLine();
s2 = s1.Normalize(NormalizationForm.FormD);
Console.Write("B3) Is s2 normalized to Form D?: ");
Console.WriteLine(s2.IsNormalized(NormalizationForm.FormD));
Show("s2", s2);
Console.WriteLine();
s2 = s1.Normalize(NormalizationForm.FormKC);
Console.Write("B4) Is s2 normalized to Form KC?: ");
Console.WriteLine(s2.IsNormalized(NormalizationForm.FormKC));
Show("s2", s2);
Console.WriteLine();
s2 = s1.Normalize(NormalizationForm.FormKD);
Console.Write("B5) Is s2 normalized to Form KD?: ");
Console.WriteLine(s2.IsNormalized(NormalizationForm.FormKD));
Show("s2", s2);
Console.WriteLine();
}
private static void Show(string title, string s)
{
Console.Write("Characters in string {0} = ", title);
foreach(short x in s) {
Console.Write("{0:X4} ", x);
}
Console.WriteLine();
}
}
/*
This example produces the following results:
Characters in string s1 = 0063 0301 0327 00BE
U+0063 = LATIN SMALL LETTER C
U+0301 = COMBINING ACUTE ACCENT
U+0327 = COMBINING CEDILLA
U+00BE = VULGAR FRACTION THREE QUARTERS
--------------------------------------------------------------------------------
A1) Is s1 normalized to the default form (Form C)?: False
A2) Is s1 normalized to Form C?: False
A3) Is s1 normalized to Form D?: False
A4) Is s1 normalized to Form KC?: False
A5) Is s1 normalized to Form KD?: False
--------------------------------------------------------------------------------
Set string s2 to each normalized form of string s1.
U+1E09 = LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
U+0033 = DIGIT THREE
U+2044 = FRACTION SLASH
U+0034 = DIGIT FOUR
--------------------------------------------------------------------------------
B1) Is s2 normalized to the default form (Form C)?: True
Characters in string s2 = 1E09 00BE
B2) Is s2 normalized to Form C?: True
Characters in string s2 = 1E09 00BE
B3) Is s2 normalized to Form D?: True
Characters in string s2 = 0063 0327 0301 00BE
B4) Is s2 normalized to Form KC?: True
Characters in string s2 = 1E09 0033 2044 0034
B5) Is s2 normalized to Form KD?: True
Characters in string s2 = 0063 0327 0301 0033 2044 0034
*/
open System
open System.Text
let show title (s: string) =
printf $"Characters in string %s{title} = "
for x in s do
printf $"{int16 x:X4} "
printfn ""
[<EntryPoint>]
let main _ =
// Character c; combining characters acute and cedilla; character 3/4
let s1 = String [| '\u0063'; '\u0301'; '\u0327'; '\u00BE' |]
let divider = String('-', 80)
let divider = String.Concat(Environment.NewLine, divider, Environment.NewLine)
show "s1" s1
printfn "\nU+0063 = LATIN SMALL LETTER C"
printfn "U+0301 = COMBINING ACUTE ACCENT"
printfn "U+0327 = COMBINING CEDILLA"
printfn "U+00BE = VULGAR FRACTION THREE QUARTERS"
printfn $"{divider}"
printfn $"A1) Is s1 normalized to the default form (Form C)?: {s1.IsNormalized()}"
printfn $"A2) Is s1 normalized to Form C?: {s1.IsNormalized NormalizationForm.FormC}"
printfn $"A3) Is s1 normalized to Form D?: {s1.IsNormalized NormalizationForm.FormD}"
printfn $"A4) Is s1 normalized to Form KC?: {s1.IsNormalized NormalizationForm.FormKC}"
printfn $"A5) Is s1 normalized to Form KD?: {s1.IsNormalized NormalizationForm.FormKD}"
printfn $"{divider}"
printfn "Set string s2 to each normalized form of string s1.\n"
printfn "U+1E09 = LATIN SMALL LETTER C WITH CEDILLA AND ACUTE"
printfn"U+0033 = DIGIT THREE"
printfn"U+2044 = FRACTION SLASH"
printfn"U+0034 = DIGIT FOUR"
printfn $"{divider}"
let s2 = s1.Normalize()
printf "B1) Is s2 normalized to the default form (Form C)?: "
printfn $"{s2.IsNormalized()}"
show "s2" s2
printfn ""
let s2 = s1.Normalize NormalizationForm.FormC
printf "B2) Is s2 normalized to Form C?: "
printfn $"{s2.IsNormalized NormalizationForm.FormC}"
show "s2" s2
printfn ""
let s2 = s1.Normalize NormalizationForm.FormD
printf "B3) Is s2 normalized to Form D?: "
printfn $"{s2.IsNormalized NormalizationForm.FormD}"
show "s2" s2
printfn ""
let s2 = s1.Normalize(NormalizationForm.FormKC)
printf "B4) Is s2 normalized to Form KC?: "
printfn $"{s2.IsNormalized NormalizationForm.FormKC}"
show "s2" s2
printfn ""
let s2 = s1.Normalize(NormalizationForm.FormKD)
printf "B5) Is s2 normalized to Form KD?: "
printfn $"{s2.IsNormalized NormalizationForm.FormKD}"
show "s2" s2
0
(*
This example produces the following results:
Characters in string s1 = 0063 0301 0327 00BE
U+0063 = LATIN SMALL LETTER C
U+0301 = COMBINING ACUTE ACCENT
U+0327 = COMBINING CEDILLA
U+00BE = VULGAR FRACTION THREE QUARTERS
--------------------------------------------------------------------------------
A1) Is s1 normalized to the default form (Form C)?: False
A2) Is s1 normalized to Form C?: False
A3) Is s1 normalized to Form D?: False
A4) Is s1 normalized to Form KC?: False
A5) Is s1 normalized to Form KD?: False
--------------------------------------------------------------------------------
Set string s2 to each normalized form of string s1.
U+1E09 = LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
U+0033 = DIGIT THREE
U+2044 = FRACTION SLASH
U+0034 = DIGIT FOUR
--------------------------------------------------------------------------------
B1) Is s2 normalized to the default form (Form C)?: True
Characters in string s2 = 1E09 00BE
B2) Is s2 normalized to Form C?: True
Characters in string s2 = 1E09 00BE
B3) Is s2 normalized to Form D?: True
Characters in string s2 = 0063 0327 0301 00BE
B4) Is s2 normalized to Form KC?: True
Characters in string s2 = 1E09 0033 2044 0034
B5) Is s2 normalized to Form KD?: True
Characters in string s2 = 0063 0327 0301 0033 2044 0034
*)
Imports System.Text
Class Example
Public Shared Sub Main()
' Character c; combining characters acute and cedilla; character 3/4
Dim s1 = New [String](New Char() {ChrW(&H0063), ChrW(&H0301), ChrW(&H0327), ChrW(&H00BE)})
Dim s2 As String = Nothing
Dim divider = New [String]("-"c, 80)
divider = [String].Concat(Environment.NewLine, divider, Environment.NewLine)
Show("s1", s1)
Console.WriteLine()
Console.WriteLine("U+0063 = LATIN SMALL LETTER C")
Console.WriteLine("U+0301 = COMBINING ACUTE ACCENT")
Console.WriteLine("U+0327 = COMBINING CEDILLA")
Console.WriteLine("U+00BE = VULGAR FRACTION THREE QUARTERS")
Console.WriteLine(divider)
Console.WriteLine("A1) Is s1 normalized to the default form (Form C)?: {0}", s1.IsNormalized())
Console.WriteLine("A2) Is s1 normalized to Form C?: {0}", s1.IsNormalized(NormalizationForm.FormC))
Console.WriteLine("A3) Is s1 normalized to Form D?: {0}", s1.IsNormalized(NormalizationForm.FormD))
Console.WriteLine("A4) Is s1 normalized to Form KC?: {0}", s1.IsNormalized(NormalizationForm.FormKC))
Console.WriteLine("A5) Is s1 normalized to Form KD?: {0}", s1.IsNormalized(NormalizationForm.FormKD))
Console.WriteLine(divider)
Console.WriteLine("Set string s2 to each normalized form of string s1.")
Console.WriteLine()
Console.WriteLine("U+1E09 = LATIN SMALL LETTER C WITH CEDILLA AND ACUTE")
Console.WriteLine("U+0033 = DIGIT THREE")
Console.WriteLine("U+2044 = FRACTION SLASH")
Console.WriteLine("U+0034 = DIGIT FOUR")
Console.WriteLine(divider)
s2 = s1.Normalize()
Console.Write("B1) Is s2 normalized to the default form (Form C)?: ")
Console.WriteLine(s2.IsNormalized())
Show("s2", s2)
Console.WriteLine()
s2 = s1.Normalize(NormalizationForm.FormC)
Console.Write("B2) Is s2 normalized to Form C?: ")
Console.WriteLine(s2.IsNormalized(NormalizationForm.FormC))
Show("s2", s2)
Console.WriteLine()
s2 = s1.Normalize(NormalizationForm.FormD)
Console.Write("B3) Is s2 normalized to Form D?: ")
Console.WriteLine(s2.IsNormalized(NormalizationForm.FormD))
Show("s2", s2)
Console.WriteLine()
s2 = s1.Normalize(NormalizationForm.FormKC)
Console.Write("B4) Is s2 normalized to Form KC?: ")
Console.WriteLine(s2.IsNormalized(NormalizationForm.FormKC))
Show("s2", s2)
Console.WriteLine()
s2 = s1.Normalize(NormalizationForm.FormKD)
Console.Write("B5) Is s2 normalized to Form KD?: ")
Console.WriteLine(s2.IsNormalized(NormalizationForm.FormKD))
Show("s2", s2)
Console.WriteLine()
End Sub
Private Shared Sub Show(title As String, s As String)
Console.Write("Characters in string {0} = ", title)
For Each x As Char In s
Console.Write("{0:X4} ", AscW(x))
Next
Console.WriteLine()
End Sub
End Class
'This example produces the following results:
'
'Characters in string s1 = 0063 0301 0327 00BE
'
'U+0063 = LATIN SMALL LETTER C
'U+0301 = COMBINING ACUTE ACCENT
'U+0327 = COMBINING CEDILLA
'U+00BE = VULGAR FRACTION THREE QUARTERS
'
'--------------------------------------------------------------------------------
'
'A1) Is s1 normalized to the default form (Form C)?: False
'A2) Is s1 normalized to Form C?: False
'A3) Is s1 normalized to Form D?: False
'A4) Is s1 normalized to Form KC?: False
'A5) Is s1 normalized to Form KD?: False
'
'--------------------------------------------------------------------------------
'
'Set string s2 to each normalized form of string s1.
'
'U+1E09 = LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
'U+0033 = DIGIT THREE
'U+2044 = FRACTION SLASH
'U+0034 = DIGIT FOUR
'
'--------------------------------------------------------------------------------
'
'B1) Is s2 normalized to the default form (Form C)?: True
'Characters in string s2 = 1E09 00BE
'
'B2) Is s2 normalized to Form C?: True
'Characters in string s2 = 1E09 00BE
'
'B3) Is s2 normalized to Form D?: True
'Characters in string s2 = 0063 0327 0301 00BE
'
'B4) Is s2 normalized to Form KC?: True
'Characters in string s2 = 1E09 0033 2044 0034
'
'B5) Is s2 normalized to Form KD?: True
'Characters in string s2 = 0063 0327 0301 0033 2044 0034
'
Normalize()
Zwraca nowy ciąg, którego wartość tekstowa jest taka sama jak ten ciąg, ale którego reprezentacja binarna znajduje się w postaci normalizacji Unicode C.
public:
System::String ^ Normalize();
public string Normalize();
member this.Normalize : unit -> string
Public Function Normalize () As String
Zwraca
Nowy, znormalizowany ciąg, którego wartość tekstowa jest taka sama jak ten ciąg, ale którego reprezentacja binarna znajduje się w postaci normalizacji C.
Wyjątki
Bieżące wystąpienie zawiera nieprawidłowe znaki Unicode.
Uwagi
Niektóre znaki Unicode mają wiele równoważnych reprezentacji binarnych składających się z zestawów łączących i/lub złożonych znaków Unicode. Na przykład dowolny z następujących punktów kodu może reprezentować literę "ắ":
U+1EAF
U+0103 U+0301
U+0061 U+0306 U+0301
Istnienie wielu reprezentacji pojedynczego znaku komplikuje wyszukiwanie, sortowanie, dopasowywanie i inne operacje.
Standard Unicode definiuje proces nazywany normalizacją, który zwraca jedną reprezentację binarną, gdy podano dowolną równoważną reprezentację binarną znaku. Normalizację można wykonać za pomocą kilku algorytmów, nazywanych formami normalizacji, które przestrzegają różnych reguł. .NET obsługuje cztery formularze normalizacji (C, D, KC i KD), które są zdefiniowane przez standard Unicode. Gdy dwa ciągi są reprezentowane w tej samej postaci normalizacji, można je porównać przy użyciu porównania porządkowego.
Aby znormalizować i porównać dwa ciągi, wykonaj następujące czynności:
Uzyskaj ciągi do porównania ze źródła wejściowego, takiego jak plik lub urządzenie wejściowe użytkownika.
Wywołaj metodę , Normalize() aby znormalizować ciągi do normalizacji formularza C.
Aby porównać dwa ciągi, wywołaj metodę, która obsługuje porównywanie ciągów porządkowych, takich jak Compare(String, String, StringComparison) metoda, i podaj wartość StringComparison.Ordinal lub StringComparison.OrdinalIgnoreCase jako StringComparison argument. Aby posortować tablicę znormalizowanych ciągów, przekaż
comparerwartość StringComparer.Ordinal lub StringComparer.OrdinalIgnoreCase do odpowiedniego przeciążenia .Array.SortEmituj ciągi w posortowanych danych wyjściowych na podstawie kolejności wskazanej w poprzednim kroku.
Opis obsługiwanych formularzy normalizacji Unicode można znaleźć w temacie System.Text.NormalizationForm.
Notatki dotyczące wywoływania
Metoda IsNormalized zwraca false się natychmiast po napotkaniu pierwszego nienormalizowanego znaku w ciągu. W związku z tym, jeśli ciąg zawiera nienormalizowane znaki, po których następuje nieprawidłowe znaki Unicode, Normalize metoda zgłosi ArgumentException wyjątek , chociaż IsNormalized zwraca wartość false.
Zobacz też
Dotyczy
Normalize(NormalizationForm)
Zwraca nowy ciąg, którego wartość tekstowa jest taka sama jak ten ciąg, ale którego reprezentacja binarna znajduje się w określonej postaci normalizacji Unicode.
public:
System::String ^ Normalize(System::Text::NormalizationForm normalizationForm);
public string Normalize(System.Text.NormalizationForm normalizationForm);
member this.Normalize : System.Text.NormalizationForm -> string
Public Function Normalize (normalizationForm As NormalizationForm) As String
Parametry
- normalizationForm
- NormalizationForm
Formularz normalizacji Unicode.
Zwraca
Nowy ciąg, którego wartość tekstowa jest taka sama jak ten ciąg, ale którego reprezentacja binarna znajduje się w postaci normalizacji określonej przez normalizationForm parametr .
Wyjątki
Bieżące wystąpienie zawiera nieprawidłowe znaki Unicode.
Uwagi
Niektóre znaki Unicode mają wiele równoważnych reprezentacji binarnych składających się z zestawów łączących i/lub złożonych znaków Unicode. Istnienie wielu reprezentacji pojedynczego znaku komplikuje wyszukiwanie, sortowanie, dopasowywanie i inne operacje.
Standard Unicode definiuje proces nazywany normalizacją, który zwraca jedną reprezentację binarną, gdy podano dowolną równoważną reprezentację binarną znaku. Normalizację można wykonać za pomocą kilku algorytmów, nazywanych formami normalizacji, które przestrzegają różnych reguł. .NET obsługuje cztery formularze normalizacji (C, D, KC i KD), które są zdefiniowane przez standard Unicode. Gdy dwa ciągi są reprezentowane w tej samej postaci normalizacji, można je porównać przy użyciu porównania porządkowego.
Aby znormalizować i porównać dwa ciągi, wykonaj następujące czynności:
Uzyskaj ciągi do porównania ze źródła wejściowego, takiego jak plik lub urządzenie wejściowe użytkownika.
Wywołaj metodę , Normalize(NormalizationForm) aby znormalizować ciągi do określonego formularza normalizacji.
Aby porównać dwa ciągi, wywołaj metodę, która obsługuje porównywanie ciągów porządkowych, takich jak Compare(String, String, StringComparison) metoda, i podaj wartość StringComparison.Ordinal lub StringComparison.OrdinalIgnoreCase jako StringComparison argument. Aby posortować tablicę znormalizowanych ciągów, przekaż
comparerwartość StringComparer.Ordinal lub StringComparer.OrdinalIgnoreCase do odpowiedniego przeciążenia .Array.SortEmituj ciągi w posortowanych danych wyjściowych na podstawie kolejności wskazanej w poprzednim kroku.
Opis obsługiwanych formularzy normalizacji Unicode można znaleźć w temacie System.Text.NormalizationForm.
Notatki dotyczące wywoływania
Metoda IsNormalized zwraca false się natychmiast po napotkaniu pierwszego nienormalizowanego znaku w ciągu. W związku z tym jeśli ciąg zawiera nienormalizowane znaki, po których następują nieprawidłowe znaki Unicode, Normalize metoda może zgłosić ArgumentException wyjątek , chociaż IsNormalized zwraca wartość false.