Looking for .net Keywords? Try Ask4Keywords

.NET FrameworkZeichenketten


Bemerkungen

In .NET-Zeichenfolgen ist System.String eine Folge von Zeichen System.Char . Jedes Zeichen ist eine UTF-16-codierte System.String . Diese Unterscheidung ist wichtig, da die Definition der Zeichen in gesprochener Sprache und die Definition von Zeichen in .NET (und vielen anderen Sprachen) unterschiedlich sind.

Ein Zeichen , das korrekt als Graphem bezeichnet werden sollte , wird als Glyphe angezeigt und durch einen oder mehrere Unicode- Codepunkte definiert. Jeder Codepunkt wird dann in einer Folge von Codeeinheiten codiert. Jetzt sollte klar sein, warum ein einzelnes System.Char nicht immer ein Graphem darstellt. Sehen wir uns in der Realität an, wie sie sich unterscheiden:

  • Ein Graphem kann aufgrund der Kombination von Zeichen zu zwei oder mehr Codepunkten führen: à setzt sich aus zwei Codepunkten zusammen: U + 0061 LATEINER KLEINER BUCHSTABE A und U + 0300 . Dies ist der häufigste Fehler, weil "à".Length == 2 während Sie 1 erwarten können.
  • Es gibt Zeichen dupliziert, zum Beispiel à eine einzige Codepunkt U + 00E0 Kleines a mit Gravis oder zwei Code-Punkte sein können , wie oben erläutert. Offensichtlich müssen sie dasselbe vergleichen: "\u00e0" == "\u0061\u0300" (auch wenn "\u00e0".Length != "\u0061\u0300".Length ). Dies ist möglich, da die Zeichenfolge normalisiert wird , indem die Methode String.Normalize() verwendet wird.
  • Eine Unicode - Sequenz , die eine zusammengesetzte oder zerlegt Sequenz enthalten kann, beispielsweise Zeichen U + D55C HAN CHARACTER kann einen einzigen Codepunkt (codiert als einzelne Code-Einheit in UTF-16) oder eine zerlegt Sequenz seiner Silben ᄒ, und . Sie müssen gleich verglichen werden.
  • Ein Codepunkt kann in mehr als eine Codeeinheit codiert werden: Das Zeichen 𠂊 U + 2008A HAN CHARACTER ist als zwei System.Char Codierung ( "\ud840\udc8a" ) "\ud840\udc8a" auch wenn es sich nur um einen Codepunkt handelt: UTF-16 Kodierung hat keine feste Größe! Dies ist eine Quelle unzähliger Fehler (auch schwerwiegender Sicherheitsfehler). Wenn Ihre Anwendung beispielsweise eine maximale Länge anwendet und den String blind verkürzt, können Sie einen ungültigen String erstellen.
  • Einige Sprachen haben digraph und trigraphs, zum Beispiel in der Tschechischen ch ist ein Standalone - Brief (nach h und bevor ich dann , wenn eine Liste von Strings Bestellung Sie fyzika vor Chemie hat.

Es gibt viel mehr Probleme bei der Textverarbeitung, siehe beispielsweise Wie kann ich einen Unicode-fähigen Zeichenvergleich durchführen? für eine breitere Einführung und mehr Links zu verwandten Argumenten.

Im Allgemeinen können Sie beim Umgang mit internationalem Text diese einfache Funktion verwenden, um Textelemente in einer Zeichenfolge aufzulisten (um Unicode-Ersatzzeichen und die Kodierung nicht zu beschädigen):

public static class StringExtensions
{
    public static IEnumerable<string> EnumerateCharacters(this string s)
    {
        if (s == null)
            return Enumerable.Empty<string>();

        var enumerator = StringInfo.GetTextElementEnumerator(s.Normalize());
        while (enumerator.MoveNext())
            yield return (string)enumerator.Value;
    }
}

Zeichenketten Verwandte Beispiele