Как преобразовать escape-последовательности Unicode в символы Unicode в строке .NET? - PullRequest
28 голосов
/ 08 октября 2008

Допустим, вы загрузили текстовый файл в строку и хотите конвертировать все экранированные символы Юникода в действительные символы Юникода внутри строки.

Пример:

"Ниже приводится верхняя половина целого символа в Unicode '\ u2320', а это нижняя половина '\ U2321'."

Ответы [ 4 ]

45 голосов
/ 08 октября 2008

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

Пример 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})" );

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

Выход из Юникода обрабатывается так:

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

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

match.Value.Substring(2)

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

NumberStyles.HexNumber

Затем мы приводим полученное число к символу Unicode:

(char)

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

.ToString()

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

9 голосов
/ 20 января 2009

Рефакторинг немного больше:

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 ());
5 голосов
/ 30 октября 2012

Это эквивалент VB.NET:

Dim rx As New RegularExpressions.Regex("\\[uU]([0-9A-Fa-f]{4})")
result = rx.Replace(result, Function(match) CChar(ChrW(Int32.Parse(match.Value.Substring(2), Globalization.NumberStyles.HexNumber))).ToString())
0 голосов
/ 04 июля 2012

Я думаю, вам лучше добавить маленькие буквы к вашему регулярному выражению. У меня получилось лучше.

Regex rx = new Regex(@"\\[uU]([0-9A-Fa-f]{4})");
result = rx.Replace(result, match => ((char) Int32.Parse(match.Value.Substring(2), NumberStyles.HexNumber)).ToString());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...