Как я преобразовываю Управляющих последовательность Unicode в символы Unicode в строке.NET?

28
задан Daniel A. White 6 March 2019 в 20:28
поделиться

2 ответа

Ответ прост и работает хорошо со строками по крайней мере до нескольких тысяч символов.

Пример 1:

Regex  rx = new Regex( @"\\[uU]([0-9A-F]{4})" );
result = rx.Replace( result, match => ((char) Int32.Parse(match.Value.Substring(2), NumberStyles.HexNumber)).ToString() );

Пример 2:

Regex  rx = new Regex( @"\\[uU]([0-9A-F]{4})" );
result = rx.Replace( result, delegate (Match match) { return ((char) Int32.Parse(match.Value.Substring(2), NumberStyles.HexNumber)).ToString(); } );

первый пример показывает замену, сделанную с помощью лямбда-выражения (C# 3.0) и второе использование делегат, который должен работать с C# 2.0.

Для разрушения, что продолжается здесь сначала мы создаем регулярное выражение:

new Regex( @"\\[uU]([0-9A-F]{4})" );

Тогда мы называем Замену () со строкой 'результатом' и анонимным методом (лямбда-выражение в первом примере и делегат во втором - делегат мог также быть обычным методом), который преобразовывает каждое регулярное выражение, которое найдено в строке.

Escape Unicode обрабатывается как это:

((char) Int32.Parse(match.Value.Substring(2), NumberStyles.HexNumber)).ToString(); });

Добираются, строка, представляющая часть числа Escape (пропустите первые два символа).

match.Value.Substring(2)

Синтаксический анализ та строка с помощью Int32. Синтаксический анализ (), который берет строку и числовой формат, который должен ожидать Синтаксический анализ () функция, который в этом случае является шестнадцатеричным числом.

NumberStyles.HexNumber

Тогда мы бросаем получающееся число к символу Unicode:

(char)

И наконец мы называем ToString () на символе Unicode, который дает нам его строковое представление, которое является значением, пасуемым назад для Замены ():

.ToString()

Примечание: Вместо того, чтобы захватить текст, который будет преобразован с вызовом Подстроки, Вы могли использовать параметр соответствия GroupCollection, и подвыражения в регулярном выражении для получения просто номера ('2320'), но это более сложно и менее читаемо.

45
ответ дан Peter Mortensen 28 November 2019 в 03:00
поделиться

Пересмотренный немного больше:

Regex regex = new Regex (@"\\U([0-9A-F]{4})", RegexOptions.IgnoreCase);
string line = "...";
line = regex.Replace (line, match => ((char)int.Parse (match.Groups[1].Value,
  NumberStyles.HexNumber)).ToString ());
9
ответ дан George Tsiokos 28 November 2019 в 03:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: