标签归档:utf8

过滤utf8mb4字符转为mysql支持的utf8

最近做开发 发现,有些字符不能存进mysql,后来百度后,得出的结论是,mysql的utf8编码并不是真正完整的utf8,在mysql新版本里选择utf8mb4这才是完整的utf8编码。
手机上有些图标比如: Emoji表情图标 在mysql里面需要选择utf8mb4才能存储和显示,网上大部分用mysql存Emoji表情相关的解决办法是 把mysql的字符集改为 utf8mb4,但是 最近有个需求就是截取掉对于mysql的utf8mb4的字符集。想了几天,突然想在wordpress看代码,结果 果然找到,分享之。此方案为过滤掉 utf8mb4 的字符

我这里的mysql本来就不支持utf8mb4的,所以就这样基本上看不到效果….

    $str = '□测试,测试!123□';
    $charset = 'utf8';
    $regex = '/
        (
            (?: [\x00-\x7F]                  # single-byte sequences   0xxxxxxx
            |   [\xC2-\xDF][\x80-\xBF]       # double-byte sequences   110xxxxx 10xxxxxx
            |   \xE0[\xA0-\xBF][\x80-\xBF]   # triple-byte sequences   1110xxxx 10xxxxxx * 2
            |   [\xE1-\xEC][\x80-\xBF]{2}
            |   \xED[\x80-\x9F][\x80-\xBF]
            |   [\xEE-\xEF][\x80-\xBF]{2}';

    if ( 'utf8mb4' === $charset ) {
        $regex .= '
            |    \xF0[\x90-\xBF][\x80-\xBF]{2} # four-byte sequences   11110xxx 10xxxxxx * 3
            |    [\xF1-\xF3][\x80-\xBF]{3}
            |    \xF4[\x80-\x8F][\x80-\xBF]{2}
        ';
    }

    $regex .= '){1,40}                          # ...one or more times
        )
        | .                                  # anything else
        /x';
    $str1 = preg_replace( $regex, '$1', $str );
    var_dump($str1);

    //另一种解决方法
    $str1 = preg_replace('/[\x{10000}-\x{10FFFF}]/u', '', $str);
    var_dump($str1);