关于微信授权获取昵称含Emoji表情引发的乱码问题总结

注:本文首发在微信开房社区(https://developers.weixin.qq.com/community/develop/article/doc/000c84d49d4058d35e99bbaef5b013

做过微信授权的小伙伴都可能会遇到获取用户昵称乱码问题,那是因为微信昵称中的含有SoftBank版本的Emoji表情。

如我的微信昵称:

微信原始昵称含三种Emoji表情:
微信授权昵称未处理Emoji表情:
微信授权昵称已处理Emoji表情:

        String url = String.format("https://api.weixin.qq.com/sns/userinfo?" +
                "access_token=%s&openid=%s", wxToken.getAccess_token(), wxToken.getOpenid());
        HttpClient.get(url, new TextCallback() {
            @Override
            public void onSuccess(Map<String, List<String>> headers, String result) {
                Logger.debug("获取微信用户信息UTF8-Emoji编码前:" + result);
                result = UnicodeUtils.emojiEncode(false, result);
                Logger.debug("获取微信用户信息UTF8-Emoji编码后:" + result);
                WXUserInfo wxUserInfo = new Gson().fromJson(result, WXUserInfo.class);
                WXAuthCallback callback = WeChatSDK.getAuthCallback();
                if (callback != null) {
                    callback.onUserInfoReceived(wxUserInfo);
                }
            }

            @Override
            public void onError(int code, Throwable throwable) {
                if (callback != null) {
                    callback.onTokenCheckFailed("微信用户信息获取出错: " + code);
                }
            }
        });

 

Emoji表情有很多种版本,其中包括Unified、DoCoMo、KDDI、SoftBank和Google,不同版本的Unicode代码并不一定相同。经研究,微信昵称中的Emoji表情截止目前(2019.12.10)已知支持三种版本:

  • 1、SoftBank版本(网上一般称之为SB Unicode),如😂为E412;
  • 2、Unified版本,如😂为1F602;
  • 3、自定义表情版本,如[捂脸]。

举个例子,😂(喜极而泣)的各种编码如下:
SoftBank:0000E412
Unified:0001F602(U+1F602)
DoCoMo:0000E72A
KDDI:0000EB64
Google:000FE334
UTF-8:F09F9882(%F0%9F%98%82)
UTF-16BE:FEFFD83DDE02(\uD83D\uDE02)
UTF-16LE:FFFE3DD802DE
UTF-32BE:0000FEFF0001F602
UTF-32LE:FFFE000002F60100

Emoji表情代码表参阅:http://punchdrunker.github.io/iOSEmoji/table_html/index.html

对于SoftBank及微信自家定义的表情,需要做映射处理转换成标准的Unified版本的Emoji表情才能正常显示,否则就可能乱码。具体解决方案参见https://github.com/gzu-liyujiang/UnicodeEmoji

SoftBank版本编码与Unified版本编码对应关系
{
“E150”: “0001F68F”,
“E030”: “0001F338”,
“E151”: “0001F6BB”,
“E152”: “0001F46E”,
“E031”: “0001F531”,
“E032”: “0001F339”,
“E153”: “0001F3E3”,
…省略…
}
SoftBank版本编码与标准Unicode编码对应关系
{
“E150”: “\uD83D\uDE8F”,
“E030”: “\uD83C\uDF38”,
“E151”: “\uD83D\uDEBB”,
“E152”: “\uD83D\uDC6E”,
“E031”: “\uD83D\uDD31”,
“E032”: “\uD83C\uDF39”,
“E153”: “\uD83C\uDFE3”,
…省略…
}
SoftBank版本编码与标准的Emoji字符表情的对应关系
{
“E150”: “🚏”,
“E030”: “🌸”,
“E151”: “🚻”,
“E152”: “👮”,
“E031”: “🔱”,
“E032”: “🌹”,
“E153”: “🏣”,
…省略…
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Python 玩转 Emoji 表情,首先需要了解 EmojiUnicode 编码。 Emoji 表情其实是由 Unicode 编码规定的,每个 Emoji 表情对应着一个 Unicode 编码。Python 通过 Unicode 编码来识别和处理 Emoji 表情。 举个例子,比如常见的微笑表情,它的 Unicode 编码是 “😊” 对应的 UTF-8 编码是“F0 9F 98 8A”。Python 中可以通过 Unicode 编码来表示这个 Emoji 表情,代码为 u"\U0001F60A"。 虽然在 Python3 中默认支持 Unicode,但是为了确保在各种环境中的正常运行,我们需要使用 emoji 模块来操作 Emoji 表情。 在使用 emoji 模块时,首先需要安装,可以使用 pip 包管理工具进行安装,在 Python 中通过 import 引入这个emoji 模块,然后就可以通过 emoji.emojize() 方法来将 Unicode 转换成对应的 Emoji 表情了,同时 emoji.demojize() 方法可以将 Emoji 表情转换成对应的 Unicode 编码。 接下来我们可以使用这个模块来实现一些简单的 Emoji 表情操作。 比如我们可以使用下面这段代码来输出一句话,并添加一个微笑表情: from emoji import emojize print(emojize("大家好! :smile:")) 运行效果如下: 大家好! 😊 除了普通的 Emoji 表情外,emoji 模块还支持一些表情的组合,如使用 emoij.emojize(":thumbs_up: :skin-tone-2:") 可以得到一个带有中等肤色点赞的 Emoji 表情。 总之,Python 可以很方便的处理 Emoji 表情emoji 模块为我们提供了很好的支持,如有需要还可以自定义 Emoji 表情,玩转 Emoji,让您的 Python 更加生动有趣。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贵州山魈羡民

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值