Конвертировать литералы UTF-8 в читаемую строку, C #? - PullRequest
2 голосов
/ 01 июля 2019

У меня есть следующая строка

const string nameString = @"\xda\xa9\xd8\xa7\xd8\xb1\xd8\xa8\xd8\xb1";

Я пытался:

var name = Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(nameString));

Не работает.

Здесь вы можете найти настоящих персонажей:
https://utf8 -chartable.de / unicode-utf8-table.pl начать = 1536 & Number = 128 & имена = -? & Utf8 = строка литерала
например: U+0631 ر \xd8\xb1

Как мы можем преобразовать его в читаемую строку в C #?

Ответы [ 2 ]

2 голосов
/ 01 июля 2019

Ну, нам нужно разобрать : каждый "\xa9" должен быть преобразован в byte 0xa9

  const string nameString = @"\xda\xa9\xd8\xa7\xd8\xb1\xd8\xa8\xd8\xb1";

Мы можем сделать это с помощью регулярные выражения :

  byte[] data = Regex
    .Matches(nameString, @"\\x(?<value>[0-9a-fA-F]{1,2})")
    .Cast<Match>()
    .Select(match => (Convert.ToByte(match.Groups["value"].Value, 16)))
    .ToArray();

Давайте посмотрим на данные:

  // da a9 d8 a7 d8 b1 d8 a8 d8 b1
  Console.WriteLine(string.Join(" ", data.Select(b => b.ToString("x2"))));     

Наконец, мы хотим закодировать data в строку;при условии, что мы должны использовать UTF8:

  string name = Encoding.UTF8.GetString(data);

  Console.WriteLine(name);

Результат:

  کاربر
1 голос
/ 01 июля 2019

Использование знака @ заставляет escape-последовательности интерпретироваться буквально. Снимите знак @ для достижения желаемого результата.

Для получения дополнительной информации см. @ (C # Reference) .

Символ @ в этом случае определяет дословный строковый литерал. Простые escape-последовательности (такие как «\» для обратной косой черты), шестнадцатеричные escape-последовательности (такие как «\ x0041» для прописных букв A) и escape-последовательности Unicode (такие как «\ u0041» для прописных букв A) интерпретируются буквально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...