Индексирование строк
Обновлен: Ноябрь 2007
Класс System.Globalization.StringInfo предоставляет методы, позволяющие разбивать строку на текстовые элементы и просматривать их. Текстовый элемент — это единица текста, которая отображается как один символ, называемый графемой. Текстовый элемент может представлять собой базовый символ, пару символов-заместителей или последовательность несамостоятельных знаков. Дополнительные сведения о парах символов-заместителей и последовательностях несамостоятельных знаков см. в разделе Поддержка Юникода для пар символов-заместителей и последовательностей несамостоятельных знаков.
С помощью метода StringInfo.GetTextElementEnumerator создается перечислитель, предназначенный для просмотра текстовых элементов строки. Метод StringInfo.ParseCombiningCharacters возвращает индексы каждого базового символа, старший символ-заместитель или управляющий символ в пределах указанной строки.
В приведенном ниже примере кода создается строка арабских символов, которая содержит последовательности несамостоятельных знаков. Например, в strCombining код Юникода U+0625 представляет арабский базовый символ (арабская буква алеф с хамзой внизу), а код Юникода U+0650 — арабский несамостоятельный знак (арабская казра). Вместе эти коды представляют последовательность несамостоятельных знаков и поэтому должны анализироваться как единый текстовый элемент. Далее создается строка, содержащая пары символов-заместителей. Например, в strSurrogates код Юникода U+DACE представляет старший заместитель, а код Юникода U+DEFF – младший заместитель. Вместе эти коды представляют пару символов-заместителей и должны анализироваться как единый текстовый элемент. Каждая строка анализируется один раз с использованием метода ParseCombiningCharacters, а затем повторно с использованием метода GetTextElementEnumerator. Оба метода правильно анализируют текстовые элементы strCombining с индексами 0, 2, 3, 5 и 6. Оба метода также правильно анализируют текстовые элементы strSurrogates с индексами 0, 2, 4, 5 и 6. Результаты анализа выводятся на экран.
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();
}
}
}
Примечание. |
---|
Если выполнять этот код в консольном приложении, указанные текстовые элементы Юникода будут отображаться неправильно, так как в консольной среде поддерживаются не все символы Юникода. |