Упаковка Emoji в виде простого текста Unicode строки PHP - PullRequest
0 голосов
/ 09 марта 2019

У меня есть веб-сайт и проект Unity, которые общаются друг с другом через веб-сервер с помощью веб-сокетов.Я кодирую / декодирую сообщения, которые отправляю, используя json.Со стороны Unity я использую Newtonsoft для json и websocketsharp для WebSockets.Сообщения отправляются нормально и все работает, но сейчас я пытаюсь внедрить смайлики в Unity для корректного отображения.Мне удалось создать спрайт-лист из всех смайликов, создать словарь, ключом которого будет их Unicode, а значениями - их положение в спрайт-листе.Проблема в том, что когда я получаю смайлик (например, Unicode odeemoji: U + 1F910), Unity получает его как «\ uD83E \ uDD10».Есть ли способ отправить эмодзи в виде строкового литерала своего Unicode?Если нет, то есть ли способ проанализировать интерпретированный c # Unicode обратно в исходный Unicode?Я нашел регулярное выражение, которое преобразует более распространенные символы из вышеуказанного формата обратно в соответствующий символ, но не возвращает мне Unicode в виде строки.Вот что я в настоящее время использую для этого:

var result = Regex.Replace(
            arrivedMessages[0],
                @"\\[Uu]([0-9A-Fa-f]{4})",
                m => char.ToString(
                (char)ushort.Parse(m.Groups[1].Value, NumberStyles.AllowHexSpecifier)));

С помощью приведенного выше кода, если пользователь отправит такой символ, как º, декодированный json будет читать \ u00ba, но вышеприведенное регулярное выражение будетпреобразовать его обратно в º.Когда я пытаюсь отправить смайлик, такой как mbсимбол, json будет читать «\ ud83e \ udd10», и результат регулярного выражения будет пустым.Есть ли проблема с регулярным выражением?Или есть лучший способ сделать это?Спасибо!

Редактировать:

Чтобы упростить общий вопрос: есть ли способ преобразовать "\ uD83E \ uDD10" обратно в строковый литерал Unicode "U + 1F910"

1 Ответ

0 голосов
/ 10 марта 2019

Вот функция, которую я использовал для преобразования суррогатных пар, как указал @Mr Lister:

        string returnValue = "";

        for (var i = 0; i < SurrogatePairString.Length; i += char.IsSurrogatePair(SurrogatePairString, i) ? 2 : 1)
        {
            var codepoint = char.ConvertToUtf32(SurrogatePairString, i);

            // keep it uppercase for the regex, then when it is found, .ToLower()
            returnValue = String.Format("U+{0:X4}", codepoint);
        }
...