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(); 更方便。
这篇文章摘自博客园还有百度空间
PHP截取中文字符串的更多相关文章
- php 获取中文长度 截取中文字符串
		#获取中文长度mb_strlen($str,$encoding); #截取中文字符串 mb_substr(str,start,length,encoding); 
- thinkphp模板中截取中文字符串的方法分享
		前段用thinkphp写了一个系统,感觉thinkphp学起来比较容易,开发起来了比较顺手,其中一个关键的因素就是它的模版引擎相当强大,使用方法跟smarty类似,在模版中还可以用php代码,有模版包 ... 
- (实用篇)php中计算中文字符串长度、截取中文字符串的函数代码
		在PHP中,我们都知道有专门的mb_substr和mb_strlen函数,可以对中文进行截取和计算长度,但是,由于这些函数并非PHP的核心函数,所以,它们常常有可能没有开启.当然,如果是用的自己的服务 ... 
- php中计算中文字符串长度、截取中文字符串
		在做PHP开发的时候,由于我国的语言环境问题,所以我们常常需要对中文进行处理.在PHP中,我们都知道有专门的mb_substr和mb_strlen函数,可以对中文进行截取和计算长度,但是,由于这些函数 ... 
- PHP截取中文字符串方法总结
		<?php @header('Content-type: text/html; charset=UTF-8'); $arr = "sa撒的发dfa多少sfd看sdf得12上24飞452 ... 
- php截取中文字符串,英文字符串,中英文字符串长度的方法
		今天学习了php函数截取中文字符串,英文字符串,中英文字符串的函数使用方法.对中英文截取方法不理解,此处先做记录. PHP自带的函数如strlen().mb_strlen()都是通过计算字符串所占字节 ... 
- php截取中文字符串 GB2312 utf-8
		UTF-8截取中文字符串 function Cn_Substr($string, $length) { preg_match_all("/[\x01-\x7f]|[\xc2-\xdf][\x ... 
- php 截取中文字符串方法
		/** * 截取中文字符串函数 * @param $str 需要截取的字串 * @param $start 开始截取的位置 * @param $length 截取的长度 * @return 此函数返回 ... 
- PHP截取中文字符串不出现?号的解决方法[原创]
		PHP截取中文字符串不出现?号的解决方法[原创] 大 | 中 | 小 [不指定 -- : | by 张宴 ] [文章作者:张宴 本文版本:v1. 最后修改: 转载请注明出处:http://blog.z ... 
随机推荐
- lintcode:格雷编码
			格雷编码 格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个二进制的差异. 给定一个非负整数 n ,表示该代码中所有二进制的总数,请找出其格雷编码顺序.一个格雷编码顺序必须以 0 开始, ... 
- How to say "no"?
			How to say "no"?7招教你如何拒绝别人 Do you have a hard time saying no to others? Do you say “y ... 
- Android笔记——Drawerlayout创建侧滑出菜单
			1.首先务必导入support-v4包 2.布局文件主标签为<android.support.v4.widget.DrawerLayout>,并为其设置id 其子标签必须包 ... 
- linux查询cpu核心数
			linux怎么查询cpu核心数 1.查看逻辑CPU个数: #cat /proc/cpuinfo |grep "processor"|sort -u|wc -l24 2.由于有超线程 ... 
- JVM生产环境参数实例及分析
			java application项目(非web项目) 改进前: -Xms128m-Xmx128m-XX:NewSize=64m-XX:PermSize=64m-XX:+UseConcMarkSweep ... 
- power designer 连接数据库提示“connection test failed”
			利用powerdesigner反向生成表结构时,需要mysql连接,配置好连接,测试时直接报:connection test failed”! OS:WIN7 旗舰版 64位 JDK: 64位 Pow ... 
- mysql插入中文数据报错:incorrect string value
			我是用的source指令来执行sql脚本文件时发现的这个错误 我的数据库用创建的时候create Database If Not Exists XXXXXX Character Set UTF8; 那 ... 
- 14_把文件存放在SDCard
			权限添加 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> /** ... 
- USACO Section 3.4: Raucous Rockers
			简单的dfs题目 /* ID: yingzho1 LANG: C++ TASK: rockers */ #include <iostream> #include <fstream&g ... 
- Maven+Spring+Mybatis+Security+Mysql简短的框架
			一段时间想搞个框架做开发,但是网上好多代码建立的都太杂乱.有的开源的东西我感觉用不了.本人太笨,不懂怎么上传到github上,就写在博客里,留作记录.以后用的时候也方便. 1.首先让我们看一下项目结构 ... 
