不改变mysql的字段属性的前提下保存emoji表情的方法 ###不改变mysql的字段属性的前提下保存emoji表情的方法 #### 背景: 在做小程序的时候,前端获取到微信昵称的时候通常带有各种emoji表情或者搜狗输入法自带的特殊符号,首先,前端人员无法对emoji表情进行加密,后台亦无法验签。 #### 过程: 前端人员尝试对符号进行base64,urlencode等方式对微信昵称进行加密,后台进行解密,能经过验签后,存储进数据库显示乱码,且在取出时框架报错: `Malformed UTF-8 characters, possibly incorrectly encoded` 一看就知道是编码出现问题。 尝试解决,从网上找到emoji的方式 1. 尝试改变mysql数据库为utfmb4,该方式支持表情存储,但是需要更改数据库链接,考虑到即使采用这种方式需要更改数据库方式,暂时滞后采纳。 2. 自动过滤emoji表情,即不保存emoji,强行过滤,完全自我麻醉啊,pass。 3. 使用base64编码存入数据库,去除时解码,尝试之,发现是骗人的,根本无法回转。 尝试各种手段后,冷静思考,在qq中可以通过/smile打出笑脸符号,如果可以在前端或者后端把emoji转化为实体,如把笑脸转化为/smile,或者[emoji]smile[/emoji]等 想到这赶紧打开composer看下市面上是否有成熟的转化库  经过各种验证与试用(过程感人),最终找到的库 `composer require chefkoch/morphoji` #### 使用方法: ```php //前端通过urlencode方式传输微信昵称 $converter = new \Chefkoch\Morphoji\Converter(); $data['nickname'] = $converter->fromEmojis(urldecode($param['nickName'])); //转化后插入数据库得到 //:emoji-1f914: 逗逗 ``` ```php //前端显示 $converter = new \Chefkoch\Morphoji\Converter(); $data['nickname'] = $converter->toEmojis($param['nickname']); ``` 页面呈现效果  #### 彩蛋 前端如何转化emoji为实体符号 [移动前端手机输入法自带emoji表情字符处理](http://blog.csdn.net/binjly/article/details/47321043 "移动前端手机输入法自带emoji表情字符处理") 改文章可行度很高,但是未经过验证