Декодирование строки с символами \u0431 C#

131
18 апреля 2022, 17:00

Есть строка вида

string s ="\u0431\u044b\u0442\u044c 12 \u0446\u0438\u0444\u0440."

Если я её вставляю в какой-нибудь онлайн сервис, то оно успешно декодируется как

быть 12 цифр.

И онлайн сервис показывает разные кодировки, автоматические им подобранные. Например, что исходный текст был unicode, а после перевода - UTF8

Ок, пишем тоже самое на С#

            string substring ="\u0431\u044b\u0442\u044c 12 \u0446\u0438\u0444\u0440."
            Encoding utf8 = Encoding.UTF8;
            Encoding unicode = Encoding.Unicode;
            // Convert the string into a byte array.
            byte[] unicodeBytes = unicode.GetBytes(substring);
            // Perform the conversion from one encoding to the other.
            byte[] utf8Bytes = Encoding.Convert(unicode, utf8, unicodeBytes);
            // Convert the new byte[] into a char[] and then into a string.
            char[] utf8Chars = new char[utf8.GetCharCount(utf8Bytes, 0, utf8Bytes.Length)];
            utf8.GetChars(utf8Bytes, 0, utf8Bytes.Length, utf8Chars, 0);
            string utf8String = new string(utf8Chars);
            Console.WriteLine(utf8string);

И на выходе получаем точно такой же

\u0431\u044b\u0442\u044c 12 \u0446\u0438\u0444\u0440.

Как я понимаю, я неправильно понял саму суть кодировки - кодировка кодирует байты, а строка изначально уже закодирована чем то внутренним в C#, возможно, тем же UTF8, поэтому он и не пытается перекодировать символы \u0431 и остальные в кириллицу, а просто считает что строка и так уже в UTF8.

Вопрос - как скормить декодеру эти самые escape-последовательности, означающие какие то киррилическим символы, чтобы в итоге он выдал мне то же самое, что и онлайн сервисы?

По запросу комментаторов вывел utf8chars, это массив чаров, поэтому вывел через foreach

вывод

\

u

0

4

4

с

1

2

Комментарий после верного ответа.

ответ дан 32 минуты назад

@vp_arth

Regex.Unescape помог. Действительно, неудобно получилось - я хотел сократить вопрос, поэтому написал строку заранее. Но на самом деле я получаю эту строку из веб реквеста, и при её выводе получаю недекодированные символы. Если взять символы снова и просто забить их в строку - всё выводится корректно. Видимо, строка как раз и делает Regex.Unescape в первый раз, поэтому повторно выводит корректно

Answer 1

В такой строке уже декодированные символы:

Console.WriteLine("\u0431\u044b\u0442\u044c 12 \u0446\u0438\u0444\u0440."); 
// быть 12 цифр.

А тут сырая строка со слешами, их можно, например, заменить вручную:

string s = @"\u0431\u044b\u0442\u044c 12 \u0446\u0438\u0444\u0440."; 
Console.WriteLine(s);
// \u0431\u044b\u0442\u044c 12 \u0446\u0438\u0444\u0440.
Regex  rx = new Regex( @"\\u([0-9a-f]{4})");
s = rx.Replace(s, match => ((char) Int32.Parse(match.Value.Substring(2), NumberStyles.HexNumber)).ToString() );
Console.WriteLine(s);
// быть 12 цифр.

Или проще:

Console.WriteLine(Regex.Unescape(@"\u0431\u044b\u0442\u044c 12 \u0446\u0438\u0444\u0440."));
// быть 12 цифр.
READ ALSO
Вешать скрипт на копию объекта

Вешать скрипт на копию объекта

у меня есть спавнер, и нужно чтоб он через время удалял объект что заспавнил, и вот я думаюкак мне повесить скрипт на уже СОЗДАННУЮ КОПИЮ, или...

170
Генерация монеток в игре Unity

Генерация монеток в игре Unity

помогите реализовать логику генерации монетокВ целом код работает, только выдает ошибку Null Reference из-за того, что монетка не создана, а я пытаюсь...

174
Разбивка текста на предложения и слова [дубликат]

Разбивка текста на предложения и слова [дубликат]

Задача с юлёрна https://ulearnme/course/basicprogramming/Praktika_Parser_predlozheniy__d41a27ad-a377-4fbd-ba1c-1bd761c69dd1

126
Строка подключение Entity для MSSQL на хостинге

Строка подключение Entity для MSSQL на хостинге

Доброе время суток, Взял хостинг goodhostkz, добавил проект и импортировал БД, но не как не могу настроить строку подключение

134