扫一扫浏览

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

未结贴
0 1309
鸿哥站长未认证 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
父元素flex之后,子元素高度自适应问题 3435
thinkphp5隐藏默认模块的一些问题 2734
教你如果处理高并发数据不同步的问题php篇 2613
关于thinkphp5.0.x getshell漏洞的说明 2588
一张纸的厚度是0.01毫米,则该纸对折30次后是多厚(据说超过珠穆朗玛峰的高度)php实现 2489
【全套视频】thinkphp5视频教程 2468
移动web资源整理,你值得收藏的干货 2442
omnicore rpc api中文手册【usdt】 2323
PHP如何判断字符串是否为json格式 2313
tpframe新建主题 2286
月度热议HOT COMMENTS
tpframe 后续版本你希望有的功能是什么(分享贴) 12
关于tpframe的一点话题 6
cms插件在分类排序的时候JSON错误 6
基于tpframe v3.x 的微信公众号插件已批量上线 5
tpframe插件tcms插件v2.2已发布上线,欢迎下载使用 5
新增的管理员没有权限操作CMS模块。 3
api接口文档插件easydoc的基本用法,快速搞定接口文档 3
thinkphp5自动完成操作,两次运行的详解 2
thinkphp5隐藏默认模块的一些问题 2
tpframe-curd操作之添加数据 2