A indexação de seqüência de caracteres

O System.Globalization.StringInfo classe fornece métodos que permitem que você dividir uma cadeia de caracteres em elementos de texto e iterar por meio desses elementos de texto. Um elemento de texto é uma unidade de texto que é exibido como um único caractere, chamado de um grapheme. Um elemento de texto pode ser uma caracteres de combinação, um par substituto ou um caractere base seqüência. Para obter mais informações sobre pares substitutos e combinar seqüências de caracteres, consulte Suporte a Unicode para pares substitutos e combinar seqüências de caracteres.

Use o StringInfo.GetTextElementEnumerator método para criar um enumerador que pode iterar por meio dos elementos de uma seqüência de caracteres. Use o StringInfo.ParseCombiningCharacters método para retornar os índices de cada caractere base, o substituto alto ou o controle de caracteres em uma seqüência de caracteres especificada.

O exemplo de código a seguir, uma seqüência de caracteres do arábico caracteres que contém a combinação de seqüências de caracteres é criada. Em strCombining, por exemplo, o Unicode código U + 0625 representa um árabe basear o caractere (Letra árabe Alef com Hamza inferior) e o código Unicode U + 0650 representa um árabe a combinação de caracteres (Kasra árabe). Juntos, esses códigos representam uma combinação seqüência de caracteres e portanto deve ser analisada como um único elemento de texto. Em seguida, uma seqüência de caracteres que contém os pares substitutos é criada. Em strSurrogates, por exemplo, o código Unicode U + DACE representa um substituto alto e o código Unicode U + DEFF representa um substituto baixo. Juntos, esses códigos representam um par substituto e devem ser analisados como um único elemento de texto. Cada seqüência de caracteres é analisada uma vez usando o ParseCombiningCharacters método e novamente usando o GetTextElementEnumerator método. Ambos os métodos analisar corretamente os elementos de texto em strCombining em que os índices de 0, 2, 3, 5 e 6. Ambos os métodos analisar corretamente os elementos de texto em strSurrogates em que os índices de 0, 2, 4, 5 e 6. Os resultados das operações de análise são exibidos.

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();
         }
   }
}

Observação

Se você executar esse código em um aplicativo de console, os elementos de texto Unicode especificados não serão exibidos corretamente porque o ambiente do console não oferece suporte a todos os caracteres Unicode.

Consulte também

Referência

StringInfo

Conceitos

Unicode no estrutura Pacote Microsoft Office 2010

Outros recursos

Codificação e localização