Преобразовать неэкранированную строку Юникода в Юникод - PullRequest
0 голосов
/ 25 января 2019

У меня есть текстовая строка из базы данных mysql, которая

var str = "u0393u03a5u039du0391u0399u039au0391".

Я хочу заменить символы Юникода, чтобы они отображались так, как они отображаются на самом деле "ΓΥΝΑΙΚΑ". Если я вручную экранирую u с \ u в .net, преобразование будет выполнено автоматически.

Я нашел следующую функцию:

byte[] unicodeBytes = Encoding.Unicode.GetBytes(str);

// Perform the conversion from one encoding to the other.
byte[] ascibytes = Encoding.Convert(Encoding.Unicode, Encoding.ASCII, unicodeBytes);

// Convert the new byte[] into a char[] and then into a string.
char[] asciiChars = new char[Encoding.ASCII.GetCharCount(ascibytes, 0, ascibytes.Length)];

Encoding.ASCII.GetChars(ascibytes, 0, ascibytes.Length, asciiChars, 0);
return new string(asciiChars);

но так как его нужно избежать, я делаю

str =str.Replace("u", @"\u")

но без везения. Как я могу конвертировать это?

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Еще один способ:

var str = "u0393u03a5u039du0391u0399u039au0391";

if (str.Length > 0 && str[0] == 'u')
    str = str.Substring(1, str.Length - 1);

string chars = string.Concat(str.Split('u').Select(s => 
    Convert.ToChar(Convert.ToInt32("0x" + s,16))));
0 голосов
/ 25 января 2019

Это, по сути, кодовые точки UTF-16, так что это подойдет (этот подход не очень эффективен, но я предполагаю, что оптимизация не является главной целью):

Regex.Replace(
    "u0393u03a5u039du0391u0399u039au0391",
    "u[0-9a-f]{4}",
    m => "" + (char) int.Parse(m.Value.Substring(1), NumberStyles.AllowHexSpecifier)
)

Это не может иметь делос неоднозначностью неэкранированных «обычных» символов в строке: dufface фактически превратится в d + \uffac + e, что, вероятно, неправильно.Тем не менее, он будет корректно обрабатывать суррогаты (ud83dudc96 - это ?).

Используя технику из этот ответ - это еще один вариант:

Regex.Unescape(@"u0393u03a5u039du0391u0399u039au0391".Replace(@"\", @"\\").Replace("u", @"\u"))

Дополнительная \ экранирование существует только в том случае, если строка уже содержит обратные слэши, которые могут быть неверно интерпретированы как escape-последовательности.

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