• 微信去除EMOJI表情


    方法是:

    方法是:return json_decode(preg_replace("#(\ue[0-9a-f]{3}|\ud83e|\udd14)#ie", "", json_encode($text)));

    原理是:

    进行微信公众号开发者接入的时候,与用户的对话互动中,涉及到的文本信息不仅仅是文字那么简单,其中可能还会包含着各种表情字符,例如「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″ 将被编码为” u4f60u597d 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并转utf8
    
    echo $text;//你好 � hello 123



  • 相关阅读:
    Android MP3录音实现
    Android应用中MVP开发模式
    ExpandableListView getChildView 不执行,不显示子列表
    Javascript中apply、call、bind
    baidu地图:实现多点连线渲染
    经纬度纠偏的一些经验
    Spark:spark df插入hive表后小文件数量多,如何合并?
    Java-Maven(七):Eclipse中Maven依赖、聚合、继承特性
    Java-Maven(六):Eclipse中Maven插件的命令操作
    Java-Maven(五):Eclipse&Maven下创建java工程&web工程
  • 原文地址:https://www.cnblogs.com/wlemory/p/4955802.html
Copyright © 2020-2023  润新知