将表情符号打包为纯文本unicode字符串php

时间:2019-03-08 22:48:42

标签: json unicode encoding emoji websocket-sharp

我有一个网站和Unity项目,它们通过使用Web套接字的Web服务器相互通信。我正在对使用json发送的消息进行编码/解码。在Unity方面,我将Newtonsoft用于json,将websocketsharp用于WebSockets。消息发送正常,一切正常,但是现在我试图在Unity中实现表情符号以正确显示。我能够创建一个包含所有表情符号的Sprite表,创建一个字典,其键为Unicode,值作为其在Sprite表中的位置。问题是,当我收到表情符号(例如,表情符号Unicode: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,但上述正则表达式会将其转换回º。当我尝试发送表情符号(例如符号)时,json将显示为“ \ ud83e \ udd10”,而正则表达式结果将为空白。正则表达式有问题吗?还是有更好的方法来做到这一点?谢谢!

编辑:

为简化总体问题:是否可以将“ \ uD83E \ uDD10”转换回Unicode“ U + 1F910”的字符串文字

1 个答案:

答案 0 :(得分:0)

正如@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);
        }