zoukankan      html  css  js  c++  java
  • php的ord函数——解决中文字符截断问题

    php的ord函数——解决中文字符截断问题

    分类: PHP

    函数是这样定义的:

    int ord ( string$string)

    返回字符串 string 第一个字符的 ASCII 码值。

    该函数是chr()的互补函数。

    试一下:

    echo ord('我');
    这里只能返回230, 我是以u8保存的文件并输出的, 它得到的只有230, 而230转换成hex是e6,实际上utf-8中我的编码是e68891, 它只拿到了第一个字节
    echo chr(0xe6).chr(0x88).chr(0x91);

    这个例子可以在utf-8的情况下输出”我“这个汉字

    如果大家想了解字符编码的问题可以点这里字符编码

    如果大家想查看一个汉字的gbk,utf-8,unicode各种编码方式推荐大家用Notepad++下的HEX-editor点击这里下载:

    http://pan.baidu.com/s/1hquyJwo

    长这样子


    提高逼格:

    身为一个程序猿,除了是苦逼的代名词外,还是神秘的象征,偶尔装XX还是不错的。既然说到编码,

    那我们就说说属于你的字吧,在utf-8编码的世界里,可不是每个人都能找到属于自己的那款哦,

    ‘我’的编码是三字节,分别为e6、88、91,如果把你的生日放进去能编出啥字呢,想想是不是还有点小激动,

    例如你是1988-9-4出生,那对应的属于自己的三字节为e9、88、94,anyway这个规则你也可以自己定义,

    爆个料,按照此方法,我的字是‘釉’,好字啊,you you 切克闹。

    按照此法为啥不是每个人都有呢,那自己读下utf-8的二进制存储规则就知道了,

    哈哈,还是点这里字符编码

    扯了一堆没用的,其实就是希望大家发现编码的乐趣大笑

     

    自己动手:

    很久以前是没有mb_substr函数的,因此带汉字的字符串截断操作处理起来很麻烦,不过现在可以直接用它。

    既然我们对字符编码和ord函数有了很好的了解,自己就写个针对utf-8编码的字符串截断的函数吧。

    代码很戳,有待优化,但理解起来简单,贴过去可以运行,基本场景也考虑到了,还算欣慰;

    [php] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. <?php  
    2.     $a = "jf我们de没";  
    3.     /**  
    4.     * @brief  
    5.     *  
    6.     * @param $str 待截取的字符串 
    7.     * @param $start 字符串开始位置  
    8.     * @param $num  截取到多长的字符串  
    9.     *  
    10.     * @return  
    11.     */  
    12.     function utf8_substr($str, $start, $num){  
    13.         $res = '';      //存储截取到的字符串  
    14.         $cnt = 0;       //计数器,用来判断字符串是否走到$start位置  
    15.         $t = 0;         //计数器,用来判断字符串已经截取了$num的数量  
    16.         for($i = 0; $i < strlen($str); $i++){  
    17.             if(ord($str[$i]) > 127){    //非ascii码时  
    18.                 if($cnt >= $start){     //如果计数器走到了$start的位置  
    19.                     $res .=$str[$i].$str[++$i].$str[++$i]; //utf-8是三字节编码,$i指针连走三下,把字符存起来  
    20.                     $t ++;              //计数器++,表示我存了几个字符串了到$num的数量就退出了  
    21.                 }else{    
    22.                     $i++;               //如果没走到$start的位置,那就只走$i指针,字符不用处理  
    23.                     $i++;     
    24.                 }         
    25.                 $cnt ++;  
    26.             }else{    
    27.                 if($cnt >= $start){     //acsii码正常处理就好  
    28.                     $res .=$str[$i];  
    29.                     $t++;     
    30.                 }         
    31.                 $cnt ++;                          
    32.             }         
    33.             if($num == $t) break;       //ok,我要截取的数量已经够了,我不贪婪,我退出了  
    34.         }         
    35.         return $res;  
    36.     }  
    37.     var_dump(utf8_substr($a, 3, 10));   //结果应该是你想要的  
    38. ?>  


    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    [BZOJ]2132: 圈地计划 最小割
    从最近MySQL的优化工作想到的
    Linux基本操作 9----- 认识与学习bash
    多路径配置vlome group共享存储,VG的更新。
    两位数乘法的速算方法(一)
    请对他有足够的重视——设计!
    ASP.NET中配置应用程序
    flex开发小技巧集锦
    刚制作完的SAP Sybase ASE15.7 [Sybase Central] 客户端
    Static 关键字的 5 种用法,你会几种?
  • 原文地址:https://www.cnblogs.com/archoncap/p/4871833.html
Copyright © 2011-2022 走看看