Indización de cadenas
La clase System.Globalization.StringInfo proporciona métodos que permiten dividir una cadena en elementos de texto y recorrer en iteración los elementos. Un elemento de texto es una unidad de texto que se muestra como un solo carácter, denominado grafema. Un elemento de texto puede ser un carácter base, un par suplente o una secuencia de caracteres de combinación. Para obtener más información acerca de los pares suplentes y las secuencias de caracteres de combinación, vea Compatibilidad de Unicode con pares suplentes y secuencias de caracteres de combinación.
El métodoStringInfo.GetTextElementEnumerator se usa para crear un enumerador que pueda recorrer en iteración los elementos de una cadena. El métodoStringInfo.ParseCombiningCharacters se usa para devolver los índices de cada carácter base, suplente alto o carácter de control de una cadena especificada.
En el ejemplo de código siguiente se crea una cadena de caracteres de árabe que contiene secuencias de caracteres de combinación. En strCombining
, por ejemplo, el código Unicode U+0625 representa un carácter base de árabe (la letra árabe Alef con Hamza debajo) y el código Unicode U+0650 representa un carácter combinado de árabe (Kasra de árabe). Juntos, esos códigos representan una secuencia de caracteres de combinación y, por lo tanto, deben analizarse como un solo elemento de texto. A continuación, se crea una cadena que contiene pares suplentes. En strSurrogates
, por ejemplo, el código Unicode U+DACE representa un suplente alto y el código Unicode U+DEFF representa un suplente bajo. Juntos, esos códigos representan un par suplente y deben analizarse como un solo elemento de texto. Cada cadena se analiza una vez utilizando el método ParseCombiningCharacters y de nuevo utilizando el método GetTextElementEnumerator. Ambos métodos analizan correctamente los elementos de texto de strCombining
en los índices 0, 2, 3, 5, y 6. Ambos métodos analizan correctamente los elementos de texto de strSurrogates
en los índices 0, 2, 4, 5, y 6. Se muestra el resultado de las operaciones de análisis.
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
Si este código se ejecuta en una aplicación de consola, los elementos de texto Unicode especificados no se mostrarán correctamente porque el entorno de consola no admite todos los caracteres Unicode.