zoukankan      html  css  js  c++  java
  • PHP中文无乱码截取

    正在上传文件反正无聊 就把php无乱码截取写出来吧`

    参数说明

        gbk    字符编码中,存储中文字符要2个字节

        uft-8  字符编码中,存储中文字符要3个字节

        0xa0  半个汉字

        ord()— 返回字符的 ASCII 码值

        chr() — 返回指定的字符


     

    在网上我也看到一些截取中文的函数 但是我认为他们是有缺陷的 如不能区别utf-8  gbk的字符集 中文 于是我自己写了一个

    但是我却发现我写的函数其实是用mb系列函数 ,我也是廋少不了

    header("content-type:text/html; charset = gbk");
        function chinesesubstr($str,$star,$len,$char_set='uft8'){
            $tmpstr = null;
            $char_set=='gbk'?$char_set=2:$char_set=3; //根据不同的字符集 来截取不同的长度
            $strlen = $star+$len;
            for( $i=0;$i<$strlen;$i++ ){
                if(ord(substr($str,$i,1))>0xa0){
                     $tmpstr .= substr($str,$i,$char_set);
                     $i++;
                }else{
                     $tmpstr .= substr($str,$i,1);
                }
            }
            return $tmpstr;
        }
    //中文(中文特殊符号->有一些事不区分中英的#%*等):3 数字:1 字母(特殊符号):1 
    echo chinesesubstr('玩儿qqq额外人听闻',0,5,'gbk');

    所以还是老老实实的写一个mb系列的函数吧

    function chinesesubstr($str,$star=0,$len,$encoding ='utf8'){
        $strlen = mb_strlen($str, $encoding); 
        if($strlen < $len){
            return $str;
        }else{
            $re_turn = mb_substr($str,$star,$len,$encoding).chr(0).'...';
            return $re_turn;
        } 
    }
    $str = "这个新闻或是文章的标题很长,需要只显示前面一些字,后面用...来代替";
    echo chinesesubstr($str,0,5);

    知识点终结

    当汉字被截断时,根据编码规则他总是要把后边的其他字符拉过来一起作为汉字解释,

    这就是出现乱码的原因。而值为0x81到0xff与0x00组合始终都显示为“空” 根据这一特点,

    在substr的结果后面补上一个chr(0),就可以防止出现乱码了

    chr(0)相关知识: 
    null是什么都没有,而chr(0)的值是0。表示成16进制是0x00,表示成二进制是00000000  
    虽然chr(0)不会显示出什么,但是他是一个字符。

  • 相关阅读:
    初试 spring web mvc
    读取网络数据缓存在本地 流程图
    servlet 过滤器实现 请求转发(跳转);跨域转发请求;tomcat 环境下。
    C# .net基于Http实现web server(web服务)
    微信公众平台开发
    Linux目录结构及作用
    MySQL事件调度器event的使用
    MySQL触发器trigger的使用
    存储过程的查、改、删
    MySQL游标的简单实践
  • 原文地址:https://www.cnblogs.com/jxkshu/p/4435895.html
Copyright © 2011-2022 走看看