如何微信公众号中添加带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,? 欢迎关注? ~[得意]跳跳][转圈][害羞]?"
)

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

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

你可能感兴趣的:(php,微信开发)