• 0
  • 0

关于unicode字符 RLO,LRO,PDF 的坑

2021-12-23 437 0 admin 所属分类:经验分享

排查错误的时候发现有一个手机号码 格式无误,正则表达式匹配也没有问题 但就是匹配不上,而其他号码却能匹配得上

将整个文本复制后粘贴到idea上发现 居然出现了一些肉眼看不到的特殊字符,也不是空格……….



经查阅资料后发现 居然是unicode字符,于是需要将其替换

三种字符的unicode编码为 不过 unicode 字符是区分大小写的 而 这三种字符在PHP中都是小写格式

LRO \u202D
PDF \u202C
RLO \u202E

unicode编码函数

//字符串转Unicode编码
function unicode_encode($strLong)
{
    $strArr = preg_split('/(?<!^)(?!$)/u', $strLong);//拆分字符串为数组(含中文字符)
    $resUnicode = '';
    foreach ($strArr as $str) {
        $bin_str = '';
        $arr = is_array($str) ? $str : str_split($str);//获取字符内部数组表示,此时$arr应类似array(228, 189, 160)
        foreach ($arr as $value) {
            $bin_str .= decbin(ord($value));//转成数字再转成二进制字符串,$bin_str应类似111001001011110110100000,如果是汉字"你"
        }
        $bin_str = preg_replace('/^.{4}(.{4}).{2}(.{6}).{2}(.{6})$/', '$1$2$3', $bin_str);//正则截取, $bin_str应类似0100111101100000,如果是汉字"你"
        $unicode = dechex(bindec($bin_str));//返回unicode十六进制
        $_sup = '';
        for ($i = 0; $i < 4 - strlen($unicode); $i++) {
            $_sup .= '0';//补位高字节 0
        }
        $str = '\\u' . $_sup . $unicode; //加上 \u  返回
        $resUnicode .= $str;
    }
    return $resUnicode;
}

unicode 解码函数 借助 json编码

//Unicode编码转字符串
function unicode_decode($str)
{
    $json = '{"str":"' . $str . '"}';
    $arr = json_decode($json, true);
    if (empty($arr)) return '';
    return $arr['str'];
}

过滤函数

/**
 * 过滤 unicode 编码 特殊 控制字符  RLO,LRO,PDF  https://www.pianshen.com/article/1580630125/
 * @param $str
 * @return mixed|string
 */
function filterUnicodeControlChar($str)
{
    $str = unicode_encode($str);
    // 这三种字符 大小写转换其实都一样 但是 unicode 大小写又是敏感的..... 索性针对这三种字符串忽略大小写替换
    $str = str_ireplace(["\u202D", "\u202C", "\u202E"], "", $str);
    return unicode_decode($str);
}


返回顶部