注:本文首發在微信開房社區(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”: “🏣”,
…省略…
}