扫一扫浏览

PHP采集入库对内容中的特殊字符处理

未结贴
0 490
鸿哥站长未认证 2018-07-18 09:54:54
收藏

今天Linux上用PHP做采集入库遇到了mysql的报错:SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xF4\x8F\xB1\x82\xF4\x8F...' for column 'content' at row 1

1531878758892403.png

远程mysql版本为5.7;

通过排查发现是内容中有特殊字符,按照网上的方式把数据库和表的字符集改为:utf8mb4  没用,问题依旧。

在本地Windows上测试没有报错,但插入的内容是不完整的;特殊字符后面的内容是被截断了的

1531878804804369.png

那么就在插入之前再用程序过滤吧,虽然这样有损效率;

PHP过滤特殊字符代码:

/**
* 过滤字符串,保留UTF8字母数字中文及部份符号
* www.timeblog.cn
* @param  String $ostr 
* @return String
*/
public function filter_utf8_char($ostr){
    preg_match_all('/[\x{FF00}-\x{FFEF}|\x{0000}-\x{00ff}|\x{4e00}-\x{9fff}]+/u',$ostr,$matches);
    $str=join('', $matches[0]);
    /*含有特殊字符需要逐个处理*/
    if($str==''){
        $returnstr='';
        $i=0;
        $str_length=strlen($ostr);
        while($i<=$str_length){
            $temp_str=substr($ostr,$i,1);
            $ascnum=Ord($temp_str);
            if($ascnum>=224){
                $returnstr=$returnstr.substr($ostr,$i,3);
                $i=$i+3;
            }elseif($ascnum>=192){
                $returnstr=$returnstr.substr($ostr,$i,2);
                $i =$i+2;
            }elseif($ascnum>=65 && $ascnum<=90){
                $returnstr=$returnstr.substr($ostr,$i,1);
                $i=$i+1;
                /*特殊字符*/
            }elseif($ascnum>=128 && $ascnum<=191){
                $i=$i+1;
            }else{
                $returnstr=$returnstr.substr($ostr,$i,1);
                $i=$i+1;
            }
        }
        $str=$returnstr;
        preg_match_all('/[\x{FF00}-\x{FFEF}|\x{0000}-\x{00ff}|\x{4e00}-\x{9fff}]+/u',$str,$matches);
        $str=join('',$matches[0]);
    }
    return $str;
}
文章来自于时间博客:《 PHP采集入库对内容中的特殊字符处理
最近热帖 HOT TOPIC
【全套视频】thinkphp5视频教程 1264
thinkphp5隐藏默认模块的一些问题 1151
TPFrame框架robot模块重磅来袭,内附2.1版本 1078
教你如果处理高并发数据不同步的问题php篇 1077
tpframe安装教程 1067
tpframe新建主题 1015
slide模块发布 1004
tpframe应用目录结构 1001
thinkphp5自动完成操作,两次运行的详解 982
TPFrame 2.1 beta版本正式发布,全部插件式开发到来 939
月度热议HOT COMMENTS
tpframe 后续版本你希望有的功能是什么(分享贴) 12
关于tpframe的一点话题 6
cms插件在分类排序的时候JSON错误 6
新增的管理员没有权限操作CMS模块。 3
api接口文档插件easydoc的基本用法,快速搞定接口文档 3
thinkphp5自动完成操作,两次运行的详解 2
tpframe-curd操作之添加数据 2
tpframe能带给你的,让你快速搞定各服务端(api,pc,mobile,wechat)代码的框架 2
slide模块发布 2
透析thinkphp5升级版开发框架tpframe 2
爆料早知道:又拍云存储插件上线我有好想法