Как заменить произвольный встроенный символ Юникода его представлением в шестнадцатеричном формате? - PullRequest
0 голосов
/ 23 октября 2018

Как мне преобразовать в следующую строку из «hello ? ?️‍?️ world» в «hello 1F610 1F441 FE0F 200D 1F5E8 FE0F world».

Что я пробовал:

    var str = "hello ? ?️‍?️ world";
    var regex = new Regex(@"(\p{Cs}\p{Cs})");
    var newStr = regex.Replace(str, m => UnicodeToString(m.Groups[1].Value));

    string UnicodeToString(string value)
    {
        var b = Encoding.UTF32.GetBytes(value);
        var str = string.Join("", b.Select(x => {  return x.ToString("x");}));
        return str;
    }

1 Ответ

0 голосов
/ 23 октября 2018

Невозможно использовать регулярные выражения, чтобы делать то, что я хочу.Я смог использовать unicode.net и циклически проходить по кодовым точкам, чтобы получить все необходимые мне элементы Юникода.

var seq = "hello ? ?️‍?️ world".Codepoints();
foreach(var cp in seq)
{
    if(cp.AsUtf32 < 127) 
    {
        sb.Append(cp.AsString());
    }
    else
    {
        sb.Append(cp.ToString().Replace("U+", "") + " ");
    }
}
sb.ToString().Dump();

Вывод: hello 1F601 1F441 FE0F 200D 1F5E8 FE0F world

...