StringInfo och TextElementEnumerator är nu UAX29-kompatibla
Före den här ändringen System.Globalization.StringInfo och System.Globalization.TextElementEnumerator hanterade inte alla grapheme-kluster korrekt. Vissa grafer delades upp i komponenterna i stället för att hållas ihop. StringInfo Nu och TextElementEnumerator bearbeta grapheme-kluster enligt den senaste versionen av Unicode Standard.
Dessutom Microsoft.VisualBasic.Strings.StrReverse följer metoden, som omvänt tecknen i en sträng i Visual Basic, nu även Unicode-standarden för grapheme-kluster.
Ändra beskrivning
Ett grapheme - eller utökat grapheme-kluster är ett enda användarupplevt tecken som kan bestå av flera Unicode-kodpunkter. Strängen som innehåller det thailändska tecknet "kam" (กำ) består till exempel av följande två tecken:
- ก (= '\u0e01') THAILÄNDSK KARAKTÄR KO KAI
- ำ (= '\u0e33') THAILÄNDSK KARAKTÄR SARA AM
När det visas för användaren kombinerar operativsystemet de två tecknen för att bilda det enskilda visningstecknet (eller grapheme) "kam" eller กำ. Emoji kan också bestå av flera tecken som kombineras för visning på ett liknande sätt.
Dricks
.NET-dokumentationen använder ibland termen "textelement" när du refererar till ett grapheme.
Klasserna StringInfo och TextElementEnumerator inspekterar strängar och returnerar information om de grafer som de innehåller. I .NET Framework (alla versioner) och .NET Core 3.x och tidigare använder dessa två klasser anpassad logik som hanterar vissa kombinationsklasser men som inte helt överensstämmer med Unicode Standard. Klasserna StringInfo och TextElementEnumerator delar till exempel felaktigt upp det enda thailändska tecknet "kam" i dess komponenter i stället för att hålla ihop dem. Dessa klasser delar också felaktigt upp emojitecknet " " 🤷🏽 ♀️ i fyra kluster (person som rycker på axlarna, modifierare för hudton, könsmodifierare och en osynlig kombination) i stället för att hålla ihop dem som ett enda grapheme-kluster.
Från och med .NET 5 StringInfo implementerar klasserna och TextElementEnumerator Unicode-standarden enligt definitionen i Unicode Standard Annex #29, rev. 35, sek. 3. I synnerhet returnerar de nu utökade grapheme-kluster för alla kombinationsklasser .
Överväg följande C#-kod:
using System.Globalization;
static void Main(string[] args)
{
PrintGraphemes("กำ");
PrintGraphemes("🤷🏽♀️");
}
static void PrintGraphemes(string str)
{
Console.WriteLine($"Printing graphemes of \"{str}\"...");
int i = 0;
TextElementEnumerator enumerator = StringInfo.GetTextElementEnumerator(str);
while (enumerator.MoveNext())
{
Console.WriteLine($"Grapheme {++i}: \"{enumerator.Current}\"");
}
Console.WriteLine($"({i} grapheme(s) total.)");
Console.WriteLine();
}
I .NET Framework och .NET Core 3.x och tidigare versioner delas graferna upp och konsolutdata är följande:
Printing graphemes of "กำ"...
Grapheme 1: "ก"
Grapheme 2: "ำ"
(2 grapheme(s) total.)
Printing graphemes of "🤷🏽♀️"...
Grapheme 1: "🤷"
Grapheme 2: "🏽"
Grapheme 3: ""
Grapheme 4: "♀️"
(4 grapheme(s) total.)
I .NET 5 och senare versioner hålls graferna tillsammans och konsolutdata är följande:
Printing graphemes of "กำ"...
Grapheme 1: "กำ"
(1 grapheme(s) total.)
Printing graphemes of "🤷🏽♀️"...
Grapheme 1: "🤷🏽♀️"
(1 grapheme(s) total.)
Med början i .NET 5 Microsoft.VisualBasic.Strings.StrReverse följer metoden, som omvänt tecknen i en sträng i Visual Basic, nu även Unicode-standarden för grapheme-kluster.
De här ändringarna ingår i en bredare uppsättning Unicode- och UTF-8-förbättringar i .NET, inklusive ett utökat GRAPHeme-klusteruppräknings-API för att komplettera uppräknings-API:erna för Unicode-skalärvärde som introducerades med System.Text.Rune typen i .NET Core 3.0.
Version introducerad
.NET 5.0
Rekommenderad åtgärd
Du behöver inte vidta några åtgärder. Dina appar beter sig automatiskt på ett mer standardkompatibelt sätt i en mängd olika globaliseringsrelaterade scenarier.