работа с символами и текстовыми элементами в строке
Сравнение строк полезно при сортировке и поиске одинаковых строк, однако иногда
требуется проверять отдельные символы в пределах строки. С подобными задачами
призваны справляться несколько методов и свойств типа
String
, в числе которых
Length
,
Chars
(индексатор в C#),
GetEnumerator
,
ToCharArray
,
Contains
,
IndexOf
,
LastIndexOf
,
IndexOfAny
и
LastIndexOfAny
.
На самом деле
System.Char
представляет одно 16-разрядное кодовое значение
в кодировке Юникод, которое необязательно соответствует абстрактному Юникод-
символу. Так, некоторые абстрактные Unicode-символы являются комбинацией
двух кодовых значений. Например, сочетание символов U+0625 (арабская буква
373
Тип.System String
«алеф» с подстрочной «хамза») и U+0650 (арабская «казра») образует один араб-
ский символ, или
текстовый элемент
.
Кроме того, представление некоторых текстовых элементов требует не одного,
а двух 16-разрядных кодовых значений. Первое называют
старшим
(high surrogate),
а второе —
младшим заменителем
(low surrogate). Значения старшего находятся
в диапазоне от U+D800 до U+DBFF, младшего — от U+DC00 до U+DFFF. Такой
способ кодировки позволяет представить в Unicode более миллиона различных
символов.
Символы-заменители востребованы в основном в странах Восточной Азии и го-
раздо меньше в США и Европе. Для корректной работы с текстовыми элементами
предназначен тип
System.Globalization.StringInfo
. Самый простой способ
воспользоваться этим типом — создать его экземпляр, передав его конструктору
строку. Чтобы затем узнать, сколько текстовых элементов содержит строка, до-
статочно прочитать свойство
LengthInTextElements
объекта
StringInfo
. Позже
можно вызвать метод
SubstringByTextElements
объекта
StringInfo
, чтобы извлечь
один или несколько последовательных текстовых элементов.
Кроме того, в классе
StringInfo
есть статический метод
GetTextElementEnumerator
,
возвращающий объект
System.Globalization.TextElementEnumerator
, который,
в свою очередь, позволяет просмотреть в строке все абстрактные символы Юникода.
Наконец, можно воспользоваться статическим методом
ParseCombiningCharacters
типа
StringInfo
, чтобы получить массив значений типа
Int32
, по длине которого
можно судить о количестве текстовых элементов в строке. Каждый элемент мас-
сива содержит индекс первого кодового значения соответствующего текстового
элемента.
Очередной пример демонстрирует различные способы использования класса
StringInfo
для управления текстовыми элементами строки:
using System;
using System.Text;
using System.Globalization;
using System.Windows.Forms;
public sealed class Program {
public static void Main() {
// Следующая строка содержит комбинированные символы
String s = "a\u0304\u0308bc\u0327";
SubstringByTextElements(s);
EnumTextElements(s);
EnumTextElementIndexes(s);
}
private static void SubstringByTextElements(String s) {
String output = String.Empty;
StringInfo si = new StringInfo(s);
for (Int32 element = 0; element < si.LengthInTextElements; element++) {
output += String.Format(
продолжение
374
Do'stlaringiz bilan baham: |