文档章节

过滤utf8 字符中超过三个字节的字符,或者非utf8字符

十一文
 十一文
发布于 2015/10/30 11:03
字数 274
阅读 1435
收藏 5
/**
 * 过滤为3字节内utf8
 * @param $str
 * @return string
 */
function filterUtf8($str)
{
    /*utf8 编码表:
    * Unicode符号范围           | UTF-8编码方式
    * u0000 0000 - u0000 007F   | 0xxxxxxx
    * u0000 0080 - u0000 07FF   | 110xxxxx 10xxxxxx
    * u0000 0800 - u0000 FFFF   | 1110xxxx 10xxxxxx 10xxxxxx
    *
    */
    $re = '';
    $str = str_split(bin2hex($str), 2);

    $mo =  1<<7;
    $mo2 = $mo | (1 << 6);
    $mo3 = $mo2 | (1 << 5);         //三个字节
    $mo4 = $mo3 | (1 << 4);          //四个字节
    $mo5 = $mo4 | (1 << 3);          //五个字节
    $mo6 = $mo5 | (1 << 2);          //六个字节


    for ($i = 0; $i < count($str); $i++)
    {
        if ((hexdec($str[$i]) & ($mo)) == 0)
        {
            $re .=  chr(hexdec($str[$i]));
            continue;
        }

        //4字节 及其以上舍去
        if ((hexdec($str[$i]) & ($mo6) )  == $mo6)
        {
            $i = $i +5;
            continue;
        }

        if ((hexdec($str[$i]) & ($mo5) )  == $mo5)
        {
            $i = $i +4;
            continue;
        }

        if ((hexdec($str[$i]) & ($mo4) )  == $mo4)
        {
            $i = $i +3;
            continue;
        }

        if ((hexdec($str[$i]) & ($mo3) )  == $mo3 )
        {
            $i = $i +2;
            if (((hexdec($str[$i]) & ($mo) )  == $mo) &&  ((hexdec($str[$i - 1]) & ($mo) )  == $mo)  )
            {
                $r = chr(hexdec($str[$i - 2])).
                    chr(hexdec($str[$i - 1])).
                    chr(hexdec($str[$i]));
                $re .= $r;
            }
            continue;
        }



        if ((hexdec($str[$i]) & ($mo2) )  == $mo2 )
        {
            $i = $i +1;
            if ((hexdec($str[$i]) & ($mo) )  == $mo)
            {
                $re .= chr(hexdec($str[$i - 1])) . chr(hexdec($str[$i]));
            }
            continue;
        }
    }
    return $re;
}


© 著作权归作者所有

十一文

十一文

粉丝 22
博文 23
码字总数 8163
作品 0
东城
程序员
私信 提问
关于 MySQL UTF8 编码下生僻字符插入失败/假死问题的分析

1、问题:mysql 遇到某些中文插入异常 最近有同学反馈了这样一个问题: 上述语句在脚本中 load 入库的时候会 hang 住,web 前端、命令行操作则要么抛出 Incorrect string value: 'xF0xA1x8B...

大数据之路
2014/11/12
16.1K
13
IOS过滤全局的Emoji表情输入

如摘要描述的上下文,现在需要解决Emoji输入导致的数据请求Error的问题。 问题原因: 在Unicode编码中,Emoji字符最小2个字节,小部分3个字节,更多4个字节,更丧心病狂的是有些输入法(比如某...

xoHome
2016/06/24
1K
14
字符编码问题:Unicode 和 UTF-8

Unicode Unicode 是一种编码,它将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码。这样乱码问题就会消失。这就是 Unicode,就像它的名字都表示的,这是一种所有符号的编码...

cooffeelis
2017/11/18
0
0
Mysql中utf8和utf8mb4区别

一、介绍 MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。好在utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。当然,...

朽木自雕
2016/06/28
0
0
perl对中文的支持

大家经常使用正则表达式的字符集从字符串中抽取或排除中文字符,但是这样做很费事,效果也并不是很理想。实际上Perl从5.6开始已经开始在内部使用utf8编码来表示字符,也就是说对中文以及其他...

像教授
2017/11/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

EDI 电子数据交换全解指南

EDI(Electronic Data Interchange,电子数据交换)技术使得企业与企业(B2B)实现通信自动化,帮助交易伙伴和组织更快更好地完成更多工作,并消除了人工操作带来的错误。从零售商到制造商、物...

EDI知行软件
今天
3
0
CentOS7的LVM动态扩容

# 问题 CentOS7上面的磁盘空间有点紧张,需要扩容。 解决 查询当前磁盘状态 [root@xxx ~]# lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTfd0 2:0 1 4K ...

亚林瓜子
今天
3
0
Kafka 0.8 Producer (0.9以前版本适用)

Kafka旧版本producer由scala编写,0.9以后已经废除 示例代码如下: import kafka.producer.KeyedMessage;import kafka.javaapi.producer.Producer;import kafka.producer.ProducerConfig;......

实时计算
今天
5
0
Giraph源码分析(八)—— 统计每个SuperStep中参与计算的顶点数目

作者|白松 目的:科研中,需要分析在每次迭代过程中参与计算的顶点数目,来进一步优化系统。比如,在SSSP的compute()方法最后一行,都会把当前顶点voteToHalt,即变为InActive状态。所以每次...

数澜科技
今天
6
0
Navicat 快捷键

操作 结果 ctrl+q 打开查询窗口 ctrl+/ 注释sql语句 ctrl+shift +/ 解除注释 ctrl+r 运行查询窗口的sql语句 ctrl+shift+r 只运行选中的sql语句 F6 打开一个mysql命令行窗口 ctrl+l 删除一行 ...

低至一折起
今天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部