Что такое текстовый элемент в контексте System.Globalization.StringInfo в C#? - PullRequest
0 голосов
/ 13 января 2020

Что такое текстовый элемент в контексте System.Globalization.StringInfo в C#?

Я знакомлюсь с понятием текстовых элементов, изучая C# через CLR через C#. И кажется, что читатель книги должен четко понимать, что такое текстовый элемент. Но я вообще не понимаю эту концепцию.

Кроме того, документация не очень многословна в топи c.

Я хотел бы узнать определение того, что представляет собой текстовый элемент.

Я предполагаю, что это просто символ Unicode, который необязательно представлен одним System.Char (поскольку в некоторых случаях он может быть представлен двумя System.Char : высокие и низкие суррогаты). Но я не уверен, что мое предположение верно.

Мое другое предположение состоит в том, что это целое слово.

Текстовые элементы упоминаются в этом фрагменте кода в CLR через C# книга:

using System;
using System.Text;
using System.Globalization;
using System.Windows.Forms;
public sealed class Program {
 public static void Main() {
  // The string below contains combining characters
  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(
    "Text element {0} is '{1}'{2}",
    element, si.SubstringByTextElements(element, 1),
    Environment.NewLine);
  }
  MessageBox.Show(output, "Result of SubstringByTextElements");
 }
 private static void EnumTextElements(String s) {
  String output = String.Empty;
  TextElementEnumerator charEnum =
   StringInfo.GetTextElementEnumerator(s);
  while (charEnum.MoveNext()) {
   output += String.Format(
    "Character at index {0} is '{1}'{2}",
    charEnum.ElementIndex, charEnum.GetTextElement(),
    Environment.NewLine);
  }
  MessageBox.Show(output, "Result of GetTextElementEnumerator");
 }
 private static void EnumTextElementIndexes(String s) {
  String output = String.Empty;
  Int32[] textElemIndex = StringInfo.ParseCombiningCharacters(s);
  for (Int32 i = 0; i < textElemIndex.Length; i++) {
   output += String.Format(
    "Character {0} starts at index {1}{2}",
    i, textElemIndex[i], Environment.NewLine);
  }
  MessageBox.Show(output, "Result of ParseCombiningCharacters");
 }
}

1 Ответ

3 голосов
/ 13 января 2020

Под Примечания , в документации, на которую вы ссылаетесь, написано:

. NET определяет элемент текста как единицу текста, которая отображается как один символ, то есть Графема. Текстовый элемент может быть базовым символом, суррогатной парой или последовательностью комбинируемых символов.

Я не эксперт, но примером последовательности комбинирующих символов может быть буква, за которой следует объединяющий диакритический знак c, например a в сочетании с ´ (сочетая острый акцент) создает á.

...