Indizierung von Zeichenfolgen

Die System.Globalization.StringInfo-Klasse stellt Methoden bereit, mit denen eine Zeichenfolge in ihre Textelemente zerlegt und diese Textelemente durchlaufen werden können. Ein Textelement ist eine Texteinheit, die als Einzelzeichen angezeigt wird. Textelemente werden auch als Grapheme bezeichnet. Ein Textelement kann ein Basiszeichen, ein Ersatzzeichenpaar oder eine Kombinationssequenz sein. Weitere Informationen zu Ersatzzeichenpaaren und Kombinationszeichensequenzen finden Sie unter Unicode-Unterstützung für Ersatzpaare und Kombinieren von Zeichensequenzen.

Verwenden Sie die StringInfo.GetTextElementEnumerator-Methode zum Erstellen eines Enumerators, der zum Durchlaufen der Elemente einer Zeichenfolge verwendet werden kann. Verwenden Sie die StringInfo.ParseCombiningCharacters-Methode, um die Indizes aller Basiszeichen, hohen Ersatzzeichen oder Steuerzeichen in einer angegebenen Zeichenfolge zurückzugeben.

Im folgenden Codebeispiel wird eine Zeichenfolge mit arabischen Zeichen erstellt, die Kombinationszeichensequenzen enthält. In strCombining steht beispielsweise der Unicode-Code U+0625 für ein arabisches Basiszeichen (den arabischen Buchstaben Alef mit Hamza unten) und der Unicode-Code U+0650 für ein arabisches Kombinationszeichen (arabisches Kasra). Zusammen ergeben diese Codes eine Kombinationszeichensequenz und müssen als einzelnes Textelement analysiert werden. Anschließend wird eine Zeichenfolge erstellt, die Ersatzzeichenpaare enthält. In strSurrogates steht beispielsweise der Unicode-Code U+DACE für ein hohes Ersatzzeichen und der Unicode-Code U+DEFF für niedriges Ersatzzeichen. Zusammen ergeben diese Codes ein Ersatzzeichenpaar und müssen als einzelnes Textelement analysiert werden. Jede Zeichenfolge wird einmal mithilfe der ParseCombiningCharacters-Methode und danach mithilfe der GetTextElementEnumerator-Methode analysiert. Beide Methoden analysieren die Textelemente in strCombining an den Indizes 0, 2, 3, 5 und 6 ordnungsgemäß. Beide Methoden analysieren die Textelemente in strSurrogates an den Indizes 0, 2, 4, 5 und 6 ordnungsgemäß. Die Ergebnisse der Analyseoperationen werden angezeigt.

Imports System
Imports System.IO
Imports System.Globalization
Imports System.Text
Imports Microsoft.VisualBasic

Public Class StringInfoSample

   Public Shared Sub Main()
      ' Creates a string with text elements at <0;2;3;5;6>.
      ' The Unicode code points specify Arabic 
      ' combining character sequences.
      Dim strCombining As String = ChrW(&H625) & ChrW(&H650) & _
         ChrW(&H64A) & ChrW(&H647) & ChrW(&H64E) & ChrW(&H627) & _
         ChrW(&H628) & ChrW(&H64C)

      ' Creates a string with text elements at <0;2;4;5;6>.
      'The Unicode code points specify private surrogate pairs.
      Dim strSurrogates As String = ChrW(&HDACE) & ChrW(&HDEFF) & _
         ChrW(&HDAAF) & ChrW(&HDEFC) & "a" & ChrW(&HD8BF) & ChrW(&HDD99)
      
      EnumerateTextElements(strCombining)
      EnumerateTextElements(strSurrogates)
   End Sub

   Public Shared Sub EnumerateTextElements(str As String)
      ' Creates a TextElementEnumerator.
      Dim TEIndices As Integer() = Nothing
      Dim TEEnum As TextElementEnumerator = Nothing      

      ' Parses the string using the ParseCombiningCharacters() method.
      Console.WriteLine(ControlChars.Newline + "Parsing '{0}' Using _
         ParseCombiningCharacters()...", str)
      Dim i As Integer
      TEIndices = StringInfo.ParseCombiningCharacters(str)
      For i = 0 To (TEIndices.Length - 1) - 1
         Console.WriteLine("Text Element {0} ({1}..{2})= {3}", i, _
            TEIndices(i), TEIndices((i + 1)) - 1, _
            str.Substring(TEIndices(i), TEIndices((i + 1)) - _
            TEIndices(i)))
      Next i
      Console.WriteLine("Text Element {0} ({1}..{2})= {3}", i, _
         TEIndices(i), str.Length - 1, str.Substring(TEIndices(i)))

      ' Parses the string using the GetTextElementEnumerator method.
      Console.WriteLine(ControlChars.Newline + "Parsing '{0}' Using _
         TextElementEnumerator...", str)
      TEEnum = StringInfo.GetTextElementEnumerator(str)

      Dim Continue As Boolean = False
      Dim TECount As Integer = - 1

      ' Note: Begins at element -1 (none).
      Continue = TEEnum.MoveNext()
      While Continue
         ' Prints the current element.
         ' Both GetTextElement() and Current retrieve the current
         ' text element. The latter returns it as an Object.
         TECount += 1
         Console.WriteLine("Text Element {0} ({1}..{2})= {3}", TECount, _
            TEEnum.ElementIndex, TEEnum.ElementIndex + _
            TEEnum.GetTextElement().Length - 1, TEEnum.Current)

         ' Moves to the next element.
         Continue = TEEnum.MoveNext()
      End While
   End Sub
End Class
using System;
using System.IO;
using System.Globalization;
using System.Text;

public class StringInfoSample
{
   public static void Main()
   {
      // Creates a string with text elements at <0;2;3;5;6>.
      // The Unicode code points specify Arabic 
      // combining character sequences.
      string strCombining =   
            "\u0625\u0650\u064A\u0647\u064E\u0627\u0628\u064C";
      // Creates a string with text elements at <0;2;4;5;6>.
      // The Unicode code points specify private surrogate pairs.
      string strSurrogates = "\uDACE\uDEFF\uDAAF\uDEFCa\uD8BF\uDD99"; 

      EnumerateTextElements(strCombining);
      EnumerateTextElements(strSurrogates);
   }

   public static void EnumerateTextElements(string str)
   {
      // Creates a TextElementEnumerator.
      int[] TEIndices = null;
      TextElementEnumerator TEEnum = null;

      // Parses the string using the ParseCombiningCharacters() method.
      Console.WriteLine
         ("\r\nParsing '{0}' Using ParseCombiningCharacters()...",str);
      int i;
      TEIndices = StringInfo.ParseCombiningCharacters(str);
      for (i = 0; i < (TEIndices.Length - 1); i++)
      {
         Console.WriteLine
            ("Text Element {0} ({1}..{2})= 
            {3}",i,TEIndices[i],TEIndices[i+1] - 1,
            str.Substring(TEIndices[i],TEIndices[i+1] - TEIndices[i]));
      }
      Console.WriteLine
         ("Text Element {0} ({1}..{2})= {3}",i,TEIndices[i],str.Length - 
         1, str.Substring(TEIndices[i]));

      // Parses the string using the GetTextElementEnumerator method.
      Console.WriteLine
         ("\r\nParsing '{0}' Using TextElementEnumerator...",str);
      TEEnum = StringInfo.GetTextElementEnumerator(str);

      bool Continue = false;
      int TECount = -1;

      // Note: Begins at element -1 (none).
      Continue = TEEnum.MoveNext();
      while (Continue)
      {
         // Prints the current element.
         // Both GetTextElement() and Current retrieve the current
         // text element. The latter returns it as an Object.
         TECount++;
         Console.WriteLine("Text Element {0} ({1}..{2})=  
               {3}",TECount,TEEnum.ElementIndex,
               TEEnum.ElementIndex + TEEnum.GetTextElement().Length - 1, 
               TEEnum.Current);

         // Moves to the next element.
         Continue = TEEnum.MoveNext();
         }
   }
}
HinweisHinweis

Wenn Sie diesen Code in einer Konsolenanwendung ausführen, werden die angegebenen Unicode-Textelemente nicht richtig angezeigt, da die Konsolenumgebung nicht alle Unicode-Zeichen unterstützt.

Siehe auch

Referenz

StringInfo

Konzepte

Unicode in .NET Framework

Weitere Ressourcen

Codierung und Lokalisierung