Condividi tramite


Indicizzazione di stringhe

Aggiornamento: novembre 2007

La classe System.Globalization.StringInfo fornisce metodi che consentono di suddividere una stringa nei relativi elementi di testo e di scorrere tali elementi. Un elemento di testo è un'unità di testo che viene visualizzata come singolo carattere, chiamato grafema. Un elemento di testo può essere un carattere base, una coppia di surrogati o una sequenza di caratteri in combinazione. Per ulteriori informazioni sulle coppie di surrogati e le sequenze di caratteri in combinazione, vedere Supporto Unicode per le coppie di surrogati e le sequenze di caratteri in combinazione.

Utilizzare il metodo StringInfo.GetTextElementEnumerator per creare un enumeratore in grado di scorrere gli elementi di una stringa. Utilizzare il metodo StringInfo.ParseCombiningCharacters per restituire gli indici di ciascun carattere base, surrogato alto o carattere di controllo contenuto in una stringa specificata.

Nell'esempio di codice seguente viene creata una stringa di caratteri arabi contenente sequenze di caratteri in combinazione. In strCombining, ad esempio, il codice Unicode U+0625 rappresenta un carattere base arabo (lettera araba Alef con Hamza sotto) e il codice Unicode U+0650 rappresenta un carattere in combinazione arabo (Arabic Kasra). Questi codici rappresentano insieme una sequenza di caratteri in combinazione e devono quindi essere analizzati come singolo elemento di testo. Successivamente, viene creata una stringa contenente coppie di surrogati.. In strSurrogates, ad esempio, il codice Unicode U+DACE rappresenta un surrogato alto e il codice Unicode U+DEFF rappresenta un surrogato basso. Questi codici rappresentano insieme una coppia di surrogati e devono essere analizzati come singolo elemento di testo. Ciascuna stringa viene analizzata una volta utilizzando il metodo ParseCombiningCharacters e un'altra volta utilizzando il metodo GetTextElementEnumerator. Entrambi i metodi analizzano correttamente gli elementi di testo in strCombining in corrispondenza degli indici 0, 2, 3, 5 e 6. Entrambi i metodi analizzano correttamente gli elementi di testo in strSurrogates in corrispondenza degli indici 0, 2, 4, 5 e 6. Di seguito vengono riportati i risultati delle operazioni di analisi.

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

Se questo codice viene eseguito in un'applicazione console, gli elementi di testo Unicode specificati non verranno visualizzati correttamente, poiché nell'ambiente della console non vengono supportati tutti i caratteri Unicode.

Vedere anche

Concetti

Unicode in .NET Framework

Riferimenti

StringInfo

Altre risorse

Codifica e localizzazione