微信登录昵称中文乱码 & Emoji表情乱码问题总结
2017-11-13
Python  /  /  / 已有30人围观

    APP中使用微信登录,流程一般是APP通过微信SDK请求code,然后APP使用code请求自己的服务器,服务器根据code获取access token,然后根据token和openid获取用户信息。在最后一步获取用户信息时经常出现中文乱码问题,这里记录下解决方案。


获取用户信息中文乱码


    这里的乱码主要是昵称,有时候也有国家和省份城市信息乱码,如果里面包含了中文,解决方法是:解析API请求结果之前设置encoding,这里以python为例:

import requests

req = requests.get('https://api.weixin.qq.com/sns/userinfo', params={
    'access_token': access_token,
    'openid': openid,
    'lang': 'zh_CN',
})
req.encoding = 'utf-8'  # 解决微信用户名乱码问题

print(req.json())

    网上有些地方也说需要将请求参数 lang 设置为“en”,或者设置headers中的Language为“en”;自己试了下其实不设置也OK,相反设置了之后返回的用户信息就是英文形式的,不便于我们解析和处理。


Emoji表情昵称乱码


    微信昵称中可以包含Emoji表情,为了能够正常存储用户信息,我们需要在数据库层面设置数据库字符集解决这个问题,这里以MySQL数据为例。

    通过上面的方式,我们已经可以正常解析Emoji表情,但是由于数据库字符集不支持,存储时会报错,为了能够存储Emoji表情,我们需要将数据库字符集设置为utf8mb4。具体操作如下:


1. 修改MySQL配置

# 打开配置文件
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

# 增加以下内容
[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'

# 重启MySQL
sudo service mysql restart


2. 修改数据库,表的字符集

ALTER database DB_NAME default character set = utf8mb4;
ALTER table TABLE_NAME default character set = utf8mb4;
ALTER table TABLE_NAME convert to character set utf8mb4;


 这样设置之后就可以正常存储Emoji表情啦~~


Over!

本文地址:http://xianglong.me/article/wechat-nickname-and-emoji-encoding-error/

特别声明:本站文章,如非注明,皆为降龙原创。转载需注明本文链接并保证链接可用。