• PHP截取中文字符串


    这里的输出的长度是6,那么一个汉字的字符长度就是3咯,可是老师演示的一个字符的长度却是2,百思不得其解。

    查了一下资料发现,这个问题的答案与系统所采用的字符编码方式有关:

    1. utf-8

    如果系统采用的是utf-8,那么strlen(“新闻”)=6,即一个汉字占用3个字节。linux系统默认情况下采用的该种编码方式。

    2. gb2312

    如果系统采用的是gb2312,则strlen(“新闻”)=4,即一个汉字占用2个字节。windows中文版采用的该种编码方式。

    汉字编码:GB_2312 字符集是目前最常用的汉字编码标准,windows 95/98/2000 中使用的 GBK字符集 就包含了GB2312,或者说和GB2312 兼容,GB_2312 字符集包含了 6763个的 简体汉字,和682 个标准中文符号。在这个标准中,每个汉字用2个字节来表示,每个字节的ascii码为 161-254 (16 进制A1 - FE),第一个字节 对应于 区码的1-94 区,第二个字节 对应于位码的1-94 位。  0xa0=160;

    截取中文字符串:

    function chinesesubstr($str,$start,$len){    	//$str指的是字符串,$start指的是字符串的起始位置,$len指的是长度。
    $tmpstr="";
    
    $strlen=$start+$len;	//用$strlen存储字符串的总长度(从字符串的起始位置到字符串的总长度)
    for($i=0;$i<$strlen;$i++){			//通过for循环语句,循环读取字符串
    	if(ord(substr($str,$i,1))>0xa0){   //如果字符串中首个字节的ASCII序数值大于0xa0,则表示为汉字
     	$tmpstr.=substr($str,$i,2);		//每次取出两位字符赋给变量$tmpstr,即等于一个汉字
     	$i++;	//变量自加1(因为截取了两个字符串,所以这里加1,上面的循环条件再自加1,正好是两个字符)
    	}else{						//如果不是汉字,则每次取出一位字符赋给变量$tmpstr
      		$tmpstr.=substr($str,$i,1);}
    	}
    return $tmpstr;						//输出字符串
    }
    

      

    其实下面的方法1、2现在不推荐了,读者们看了就当多了解了吧,网友有留言,其实php有现成的用于多字节安全的字符串截取函数的mb_substr,

    参照:http://www.php.net/manual/zh/function.mb-substr.php

    http://baike.baidu.com/view/4517800.htm

    方法1、字符串编码为UTF-8的,一个中文字符占三个字节:

    public static function chinesesubstr($str, $start, $len) { // $str指字符串,$start指字符串的起始位置,$len指字符串长度
            $strlen = $start + $len; // 用$strlen存储字符串的总长度,即从字符串的起始位置到字符串的总长度
            for($i = $start; $i < $strlen;) {
                if (ord ( substr ( $str, $i, 1 ) ) > 0xa0) { // 如果字符串中首个字节的ASCII序数值大于0xa0,则表示汉字
                    $tmpstr .= substr ( $str, $i, 3 ); // 每次取出三位字符赋给变量$tmpstr,即等于一个汉字
                    $i=$i+3; // 变量自加3
                } else{
                    $tmpstr .= substr ( $str, $i, 1 ); // 如果不是汉字,则每次取出一位字符赋给变量$tmpstr
                    $i++;
                }
            }
            return $tmpstr; // 返回字符串
        }
    

      方法2、字符串编码为GB2312的,一个中文字符占两个字节:

    public static function chinesesubstr($str, $start, $len) { // $str指字符串,$start指字符串的起始位置,$len指字符串长度
            $strlen = $start + $len; // 用$strlen存储字符串的总长度,即从字符串的起始位置到字符串的总长度
            for($i = $start; $i < $strlen;) {
                if (ord ( substr ( $str, $i, 1 ) ) > 0xa0) { // 如果字符串中首个字节的ASCII序数值大于0xa0,则表示汉字
                    $tmpstr .= substr ( $str, $i, 2 ); // 每次取出两位字符赋给变量$tmpstr,即等于一个汉字
                    $i=$i+2; // 变量自加2
                } else{
                    $tmpstr .= substr ( $str, $i, 1 ); // 如果不是汉字,则每次取出一位字符赋给变量$tmpstr
                    $i++;
                }
            }
            return $tmpstr; // 返回字符串
        }
    

     用mb_substr(); 更方便。 

    这篇文章摘自博客园还有百度空间

  • 相关阅读:
    nodejs历史版本下载
    dotnetcore & docker
    Openlayers 提供的 API 读取、解析和展示 GeoJSON 描述的信息
    vue父组件和子组件的生命周期到底谁先执行?
    openlayers鼠标移动获取地图经纬度格式化的两种方式
    修改IE不兼容MAP()的问题,自定义实现JavaScript的Map对象
    惠普zhan66解决连接上网线WiFi无法打开的问题。
    Git 分支管理
    Object.entries()
    vue中 .env .env.development .env.production 详细说明
  • 原文地址:https://www.cnblogs.com/perseverancevictory/p/3686089.html
Copyright © 2020-2023  润新知