如何微信公众号中添加带emoji表情的文字,并将emoji表情存储在utf8的数据库中

1、公众号中添加带emoji表情的文字
表情代码参考文档:
1)微信Emoji: http://www.tpy10.net/emo/
2)QQ表情:https://blog.csdn.net/lyq8479/article/details/9229631
示例:
weixin.php – 存储公众号回复文案

//存储在lang/weixin.php -- 用户存储微信公众号回复文案
return array(
    'welcome' => "Hi,? 欢迎关注? ~[得意]跳跳][转圈][害羞]?"
)

这里写图片描述

weixinController.php – 微信公众号逻辑处理控制器

//处理event类型消息
private function dealMsgEvent(){
    $event = strtolower($this->event);
    switch($event){
        case 'subscribe'://关注事件
            //判断该用户是否已关注过
            $oWeixinUser = WeixinUser::where('weixin_id', '=', $this->fromUserName)->first();
            //已关注过,更新关注标识
            if($oWeixinUser && $oWeixinUser->subscribe_flag == 0){
                $oWeixinUser->update(array('subscribe_flag'=>1,'subscribe_time'=>time()));
            }
            //输入欢迎语
            echo $this->endByText(Lang::get('weixin.welcome'));
            break;
        case 'unsubscribe'://取消关注事件
            //判断用户信息是否存在
            $oWeixinUser = WeixinUser::where('weixin_id','=',$this->fromUserName)->first();
            //更新用户关注标识
            if($oWeixinUser){
                $oWeixinUser->update(array('subscribe_flag' => 0));
            }
            break;
        case 'click'://关键字点击事件
               echo $this->endByText(Lang::get('weixin.expect'));
               break;
    }

}

/**
 * 回复文本信息并保存
 * @param $contentStr
 * @return string
 */
private function endByText($contentStr){
    if($contentStr){
        //消息回复
        $resultStr = WeixinBaseController::responseText($contentStr,$this->fromUserName,$this->toUserName);
        //保存输出信息,记录回复的信息
        $this->saveMsgOut($this->fromUserName, $this->toUserName, TIME, 'text', $contentStr);
    }else{
        $resultStr = '';
    }
    return $resultStr;
}

/**
 * 保存回复的信息(目前只支持文本消息)
 */
function saveMsgOut($ToUserName,$FromUserName,$CreateTime,$MsgType,$Content){
    $arr=array(
        'ToUserName'=>$ToUserName,
        'FromUserName'=>$FromUserName,
        'CreateTime'=>$CreateTime,
        'MsgType'=>$MsgType,
        //转移emoji表情符号,是可以存储到utf8格式的数据库
        'Content'=>userTextEncode($Content) 
    );
    DB::table('weixin_msg_out')->insert($arr);
}

global.php – 用户存放可全局使用的公共函数

/**
 * 把用户输入的文本转义(主要针对特殊符号和emoji表情)
 */
function userTextEncode($str){
    if(!is_string($str))return $str;
    if(!$str || $str=='undefined')return '';

    $text = json_encode($str); //暴露出unicode
    $text = preg_replace_callback("/(\\\u[ed][0-9a-f]{3})/i",function($str){
        return addslashes($str[0]);
    },$text); //将emoji的unicode留下,其他不动,这里的正则比原答案增加了d,因为我发现我很多emoji实际上是\ud开头的,反而暂时没发现有\ue开头。
    return json_decode($text);
}

/**
 * 解码 用户输入的文本转义(主要针对特殊符号和emoji表情)
 */
function userTextDecode($str){
    $text = json_encode($str); //暴露出unicode
    $text = preg_replace_callback('/\\\\\\\\/i',function($str){
        return '\\';
    },$text); //将两条斜杠变成一条,其他不动
    return json_decode($text);
}

注在正则表达式中一个反斜杠需要使用四个反斜杠来匹配:
前两个反斜杠在字符串中被解释为一个反斜杠,后两个也被解释为一个反斜杠,这时解释完毕后变成两个反斜杠,再由正则表达式解释两个反斜杠,就又解释成了一个反斜杠,所以,在正则表达式中要匹配一个反斜杠时,需要四个反斜杠。

emoji表情转义存储参考文档:
https://blog.csdn.net/ufan94/article/details/78615889

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值