IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> php特殊字符不解析处理 -> 正文阅读

[PHP知识库]php特殊字符不解析处理

方案: 将特殊字母数字通过unicode值将其映射至正常字母数字

<?php
class UnicodeUTF8Tool {

    /**
     * [utf8ToUnicode utf8 转换为 unicode]
     */
    public static function utf8ToUnicode($raw_string) {
        while (!empty($raw_string)) {
            #字符串第一个字节的字节数
            $first_character_byte_num = self::returnCharacterByteNum($raw_string);
            #第一个字符
            $character   = substr($raw_string, 0, $first_character_byte_num);
            #剩余的字符
            $raw_string  = substr($raw_string, $first_character_byte_num);
            #第一个字符的unicode序号
            $unicode     = self::characterToUnicode($character);
            #第一个字符的unicode 十六进制
            $unicode_hex = dechex($unicode);
            $unicode_hex = '\u'. self::hexAddZero($unicode_hex);

            #第一个字符的信息
            $info = compact('character', 'unicode', 'unicode_hex');
            $res[] = $info;
        }
        return $res;
    }

    /**
     * [processCharacter 特殊字符处理转正常]
     */
    public static function processCharacter($raw_string) {
        $res = '';
        while (!empty($raw_string)) {
            #字符串第一个字节的字节数
            $first_character_byte_num = self::returnCharacterByteNum($raw_string);
            #第一个字符
            $character   = substr($raw_string, 0, $first_character_byte_num);
            #剩余的字符
            $raw_string  = substr($raw_string, $first_character_byte_num);
            #第一个字符的unicode序号
            $unicode     = self::characterToUnicode($character);
            if($unicode>= 120812 &&  $unicode <= 120821){//数字映射
                $unicode = $unicode - 120764;
                $character = self::unicodeToCharacter($unicode);
            } elseif ($unicode>= 120276 &&  $unicode <= 120301) {//大写字母映射
                $unicode = $unicode - 120211;
                $character = self::unicodeToCharacter($unicode);
            } elseif ($unicode>= 120302 &&  $unicode <= 120327) {//小写字母映射
                $unicode = $unicode - 120205;
                $character = self::unicodeToCharacter($unicode);
            }
            $res .= $character;

        }
        return $res;
    }

    /**
     * [unicodeToCharacter unicode 转换为 utf8]
     */
    public static function  unicodeToCharacter($unicode_num) {
        if($unicode_num <= 0x7F ){
            return chr($unicode_num);
        }
        if($unicode_num <= 0x7FF){
            return chr(($unicode_num >> 6) + 192).
                chr(($unicode_num & 63) + 128);
        }
        if($unicode_num <= 0xFFFF){
            return chr(($unicode_num >> 12) + 224).
                chr((($unicode_num >> 6) & 63) + 128).
                chr(($unicode_num & 63) + 128);
        }
        if($unicode_num <= 0x1FFFFF){
            return chr(($unicode_num >> 18) + 240).
                chr((($unicode_num >> 12) & 63) + 128).
                chr((($unicode_num >> 6) & 63)+ 128).
                chr(($unicode_num & 63) + 128);
        }
        return '';
    }

    /**
     * [hexAddZero 十六进制补0]
     */
    public static function hexAddZero($num){
        if(strlen($num) == 1) return '000'. $num;
        if(strlen($num) == 2) return '00'. $num;
        if(strlen($num) == 3) return '0'. $num;
        return $num;
    }

    /**
     * [characterToUnicode 单个utf8 字符转换为 unicode]
     */
    public static function characterToUnicode($character) {
        #取表情的第一个字节
        $character_first = ord($character[0]);
        if ($character_first >=0 && $character_first <= 127){
            return $character_first;
        }

        #取表情的第二个字节
        $character_second = ord($character[1]);
        if ($character_first >= 192 && $character_first <= 223){
            return ($character_first - 192) * 64 + ($character_second - 128);
        }

        #取表情的第三个字节
        $character_third = ord($character[2]);
        if ($character_first >= 224 && $character_first <= 239){
            return ($character_first-224)*4096 + ($character_second - 128)*64 + ($character_third - 128);
        }

        #取表情的第四个字节
        $character_fourth = ord($character[3]);
        if ($character_first >= 240 && $character_first <= 247) {
            return ($character_first - 240) * 262144 + ($character_second - 128) * 4096 + ($character_third - 128) * 64 + ($character_fourth - 128);
        }
        return false;
    }

    /**
     * [returnCharacterLength 返回字符的字节数]
     */
    public static function returnCharacterByteNum($character) {
        #根据第一个字节大小判断几个字节
        $num = ord($character[0]);
        if ($num >= 0 && $num <= 127){
            return 1;
        }
        if ($num >= 192 && $num <= 223){
            return 2;
        }
        if ($num >= 224 && $num <= 239){
            return 3;
        }
        if ($num >= 240 && $num <= 247) {
            return 4;
        }
    }
}

查询unicode值链接:https://codepoints.net/mathematical_alphanumeric_symbols

代码来源:https://github.com/xaozhuge/php_class/blob/master/UnicodeUTF8Model.class.php

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-08-04 10:58:37  更:2021-08-04 10:59:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 1:17:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码