在进行微信公众号开发者接入的时候,与用户的对话互动中,涉及到的文本信息不仅仅是文字那么简单,其中可能还会包含着各种表情字符,例如「emoji表情」。

百科:  Emoji

由于微信接口中对于emoji表情使用的是UTF-8的二进制字符串,并没有解码,表现就是当收到微信端用户发来的emoji表情时,显示为一个方块型「」或是无法显示的字符,这时就需要对其进行转码。同理在向微信服务器发送带有emojib表情的文本消息时,也需要将表情字符编码为此格式进行发送(早前微信可以直接发送unicode码显示emoji表情,但是现在已经不支持了)。

每个emoji表情其实都有相应的unicode编码,在解析用户向公众号发送的文字中的emoji表情字符时,我们可以根据unicode码来匹配或存储信息中的emoji表情;同理在向用户发送包含emoji表情的文字消息时,则将表情字符根据unicode编码进行二进制转码后再发送。这里推荐使用softbank版本的emoji编码进行unicode转换,例如,”U+E04A” 转换为 “\ue04a”,与微信匹配。文章结尾附上了我转换好的emoji unicode编码数据表,可以与  github.com/iamcal/php-emoji 的样式表和图片相结合。

下面是我的处理方法。  首先是对收取消息时的解析部分 :

在收到一段可能含有emoji表情的文本内容后,可以简单的使用 json_encode($str) 将其进行JSON编码,此时消息中的表情、中文等字符将会被转为unicode编码显示。(这里进行JSON编码就是为了获得字符的unicode码,所以json_encode函数中不需要增加避免unicode的可选参数了)

例如: “你好  hello 123″ 将被编码为” \u4f60\u597d \ue415 hello 123 “

字符中的\ue415就是一个emoji表情,此时我们就可以对字符进行正则判断来筛选出哪些是emoji表情了。我的做法是  把emoji的unicode字符串反斜杠转义,然后再将字符json_decode还原,这样就可以将除了emoji之外的字符还原(不会影响到中文等其他字符),只留下emoji的unicode码 。

你也可以用别的方法,比如做一个标记和替换,例如将”\ue415″替换为”[em:ue415]“,类似于QQ表情的做法,在需要显示文本和表情的时候,就可以方便的对表情字符做出匹配渲染。或者也可以直接把他替换成HTML的img标签把表情图片存进去,但是这样不利于维护。

我使用的正则粗暴简单,选择了 ue000 – uefff 之间的字符视为emoji,暂时没有发现误伤:

$str = preg_replace("#(\\\ue[0-9a-f]{3})#ie","addslashes('\\1')",$str);

整个过程完整代码如下:

$text = "你好  hello 123"; //可以为收到的微信消息,可能包含二进制emoji表情字符串
$tmpStr = json_encode($text); //暴露出unicode
$tmpStr = preg_replace("#(\\\ue[0-9a-f]{3})#ie","addslashes('\\1')",$tmpStr); //将emoji的unicode留下,其他不动
$text = json_decode($tmpStr);echo $text;//你好 \ue415 hello 123

之后就可以存储信息了,在读取出信息到页面的时候就可以进行字符替换和模板渲染了。

这里可以参考这个项目提供的样式表和图片进行表情渲染:  github.com/iamcal/php-emoji

下面是  发送部分 ,就更简单了:

对于一条包含emoji的文本消息,可以先放入其unicode字符,还是拿刚才的这段来举例子:”你好 \ue415 hello 123 “。

然后  使用正则筛选出文本中的emoji unicode,对其进行二进制pack,UTF8转码,再放入原文本中 即可(这一步应该在消息发送前最后来做,先准备好完整的文本消息再进行转码处理)。代码如下:

$text = "你好 \ue415 hello 123"; //可以为将要发送的微信消息,包含emoji表情unicode字符串,需要转为utf8二进制字符串
$text = preg_replace("#\\\u([0-9a-f]+)#ie","iconv('UCS-2','UTF-8', pack('H4', '\\1'))",$text); //对emoji unicode进行二进制pack并转utf8echo $text;//你好  hello 123

这样就可以对微信服务器发送了。

附上我使用的emoji unicode的编码数据表:  mc-zone/emoji-code ,  数据中增加了根据softbank编码转换的unicode值(softb_unicode字段),可以和微信中使用的相匹配 。

表情的数据和css样式名参考了这个项目:  github.com/iamcal/php-emoji ,可以结合使用。

原文地址: http://blog.mc-zone.me/article/322

PHP处理微信中带Emoji表情的消息发送和接收(Unicode字符转码编码)相关推荐

  1. 微信中使用Emoji表情,PHP转义代码

    public function unicode2utf8_2($str){//关于unicode编码转化的第二个函数,用于显示emoji表情 $str = '{"result_str&quo ...

  2. RabbitMQ——使用Exchange中的fanout交换机实现消息发送和接收

    文章目录: 1.写在前面 2.使用fanout交换机实现消息的发送和接收 2.1 编写消息接收类(有两个) 2.2 编写消息发送类 1.写在前面 所有 MQ 产品从模型抽象上来说都是一样的过程: 消费 ...

  3. 微信小程序中使用emoji表情相关说明

    本帖将聚合一些跟emoji表情有关的知识:前端传过来的昵称和备注信息一定要经过严格的正则表达式过滤,放置出现XSS等攻击,另外emoji字体表情库应该使用base64_encode编码,拿信息的时候b ...

  4. php转换emoji表情为图片输出小程序,微信小程序中使用emoji表情相关说明

    本帖将聚合一些跟emoji表情有关的知识:相关文章:"i爱记账" 小程序后端开发小结 第7条经验前端传过来的昵称和备注信息一定要经过严格的正则表达式过滤,放置出现XSS等攻击,另外 ...

  5. mysql插入表情_向MySQL数据库中插入带emoji表情符的数据时报错

    问题:向MySQL数据库中插入带emoji表情符的数据时报错 原因:utf8字符集不支持emoji表情符,需要改为utf8mb4字符集(utf8mb4是MySQL在5.5.3之后增加的,实际开发中建议 ...

  6. 前端显示微信消息中的emoji表情

    本人是微信公众号口开发,发现一些用户发送过来的消息含有emoji表情,然后存到数据库不能正确显示,读出来都是"口口口",这个问题问到我了,我是一个前端小白,对于这种问题,我是很苦恼 ...

  7. MySQL中关于emoji表情的存储(微信登录出现登录失败【由于微信昵称字符问题】)

    MySQL中关于emoji表情的存储(微信登录出现登录失败[由于微信昵称字符问题]) 问题描述 解决方法 闲谈 问题描述 今天网站遇到用户说登录失败,查看日志发现是微信登录自动生成用户时,用户创建失败 ...

  8. Mysql怎么把微信昵称(带emoji表情)保存到数据库,亲测可用

    问题描述: 如果UTF8字符集且是Java服务器的话,当存储含有emoji表情时,会抛出类似如下异常: java.sql.SQLException: Incorrect string value: ' ...

  9. emoji昵称php,php过滤微信用户昵称emoji表情方法汇总 - 旗云号

    php过滤微信用户昵称emoji表情方法汇总 微信用户昵称带emoji表情的话,保存数据库会报错,解决办法有两种:一.修改数据库表和字段的字符集为utf8mb4:二.过滤emoji表情字符:根据自己的 ...

最新文章

  1. 计算机专业文档写作课件,计算机专业论文写作的方法.ppt
  2. Spring内核研究-通过工厂注入
  3. shared_ptr和new结合使用的几个简单例子
  4. 程序员新人怎样在复杂代码中找 bug?
  5. 鲸鱼优化算法_盘点 35 个 Java 代码优化细节
  6. vlookup练习_那个vlookup,我总是学不会啊
  7. 数据可视化最容易被人忽略的四大误区,怪不得我的报告总被老板骂
  8. 信息学奥赛一本通C++语言——1109:开关灯
  9. 分布式系统面试连环炮
  10. 幻昼计算机弹奏,freepiano曲谱_Freepiano简谱
  11. windows 下 修改mysql配置文件
  12. OpenWRT设置SmartDNS+ADGuardHome+小喵咪
  13. 前端几种本地缓存机制
  14. android恢复短信中心号码,短信中心号码设置解决安卓手机不能发短信问题,教你设置解决异地发不了短信问题...
  15. PS 2019 Mac版 自学入门系列(六)——裁剪和拉直图像
  16. vue项目如何部署?history与hash模式部署时的区别
  17. log4cxx linux 使用,log4cxx在Linux下的编译使用
  18. linux 服务器 安装网卡驱动,Linux系统下安装Intel千兆网卡驱动
  19. 微信怎么群发视频和文件?
  20. 9个比赛7进top10,阿里天池大数据竞赛思路分享

热门文章

  1. 【Java学习—(1)入门者学习的Java的数据类型】
  2. react在线文件_【前端新手也能做大项目】:从零打造一个属于自己的在线Visio项目实战【ReactJS 】 (一)...
  3. SSM之一点一滴:mybatis parameterType传入类型 resultType返回类型
  4. 华为云CENTOS下安装MySQL及重置mysql8.0密码
  5. 全国绿色电力交易试点首日:均价提高2.7分/千瓦时,风光发电迎重大利好
  6. 《机器学习实战》8.4 线性回归之乐高玩具套件二手交易价格预测
  7. 楼上有钢珠落地的声音,哒、哒、哒现象的科学解释
  8. 预测facebook签到位置运行过程中遇到的问题
  9. lwIP TCP/IP 协议栈笔记之十八: Socket接口编程
  10. 中国科学大学计算机考研有公众号吗,中国科学院大学