php实现中文字符串截取无乱码的方法

首页要知道的:
1、中文字符在gbk编码下占2个字节,在utf-8编码下占3个字节

2、ord()
函数返回字符串第一个字符的 ASCII 值

3、中文字符的ASCII值是大于0xa0。

关键的点是判断要截取的字符串是中文字符还是英文字符,用ord(substr($str,$start,1))>0xa0可判断,大于则是中文,否则是英文。实现代码如下:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46


<?php

/*

*param $str 要截取的字符串。

*param $start 从第几个开始截取,0为第一个。

*param $length 要截取的个数,默认为空,则从$start开始截取到最后一个。

*param $bite 中午字符的字节长度,默认是gbk编码,填写为2,如果是utf-8编码,则填写为3.

*/

functionmy_substr($str,$start,$length="",$bite=2){

$pos=0; //用来计算在字符串截取的字节位置

//下面这段for循环用来计算在字符串开始截取的位置

for($i=0;$i<$start;$i++){

if(ord(substr($str,$i,1))>0xa0){

$pos+=$bite;//如果是中文字符,则位置加上中午字符长度;

}else{

$pos+=1;

}

}

if($length==""){

returnsubstr($str,$pos);//如果$length为空,则从开始截取到最后一个

}else{

if($length<0){

$length=0;

}

$string="";

for($i=1;$i<=$length;$i++){

if(ord(substr($str,$pos,1))>0xa0){//如果是中午字符,

$string.=substr($str,$pos,$bite);//就要根据中午字符长度来截取

$pos+=$bite;

}else{

$string.=substr($str,$pos,1);

$pos+=1;

}

}

return$string;

}

}

$str="a这是一段中文";

echomy_substr($str,0);//从第一个开始输出到最后一个。

echo"<br>";

echomy_substr($str,0,1);//输出a;

echo"<br>";

echomy_substr($str,1,2);//输出这是;

echo"<br>";

//echo my_substr($str,1,2,3);//如果是utf-8编码,最后一个参数修改为3;

?>

5月3日股市分析预测【新人炒股入门知识】:http://licai.daiyuline.com/gupiao/330.html

大反弹会不会于今日上演【带鱼投资理财】:http://licai.daiyuline.com/gupiao/329.html

时间: 2024-10-07 17:09:57

php实现中文字符串截取无乱码的方法的相关文章

PHP中实现中文字串截取无乱码的方法

在PHP中,substr()函数截取带有中文字符串的话,可能会出现乱码,这是因为中西文一个字节所占有的字节数不一样,而substr的长度参数是按照字节去算的,在GB2312编码时,一个中文占2个字节,英文为1个字节,而在UTF-8编码当中,一个中文可能占有2个或3个字节,英文或半角标点占1字节. 直接使用PHP函数substr截取中文字符可能会出现乱码,主要是substr可能硬生生的将一个中文字符“锯”成两半.解决办法: 1.使用mbstring扩展库的mb_substr截取就不会出现乱码了.

PHP实现中文字串截取无乱码的方法

直接使用PHP函数substr截取中文字符可能会出现乱码,主要是substr可能硬生生的将一个中文字符“锯”成两半.解决办法: 1.使用mbstring扩展库的mb_substr截取就不会出现乱码了. 2.自己书写截取函数,但效率不如用mbstring扩展库来得高. 3.如果仅是为了输出截取的串,可用如下方式实现:substr($str, 0, 30).chr(0). ============================= substr()函数可以分割文字,但要分割的文字如果包括中文字符往往

【技术宅1】实现中文字串截取无乱码的方法

function substr_text($str, $start=0, $length, $charset="utf-8", $suffix=""){ if(function_exists("mb_substr")){//mb_substr函数不是php内置函数,需要加载php.mbstring.dll才能使用,否则报错 return mb_substr($str, $start, $length, $charset).$suffix; }el

PHP实现中文截取无乱码

字符串的处理是编程中比较常见的,各种编程语言对字符串的处理也提供了大量函数,像php中mb_substr()函数可以实现对中文字符串的截取,如何使用自定义方法实现中文字符串截取无乱码这也是面试经常遇到的一道题目,不要觉得这是多此一举,php内置函数已经实现了,为什么要自己实现.其实这道题的真实目的是考查你对字符编码的理解.最起码你要知道从哪里开始截取,截取几个字节才是一个完整的字符,不然截取到的都是乱码.这就需要你对多字节字符编码有一定的了解.下面一起来实现吧. 1 <?php 2 /** 3

php中文字符串截取方法实例总结

本文实例总结了php中文字符串截取方法,非常实用的技巧.具体方法分析如下: 1.使用mbstring扩展库的mb_substr截取就不会出现乱码了. 2.自己书写截取函数,但效率不如用mbstring扩展库来得高. 3.如果仅是为了输出截取的串,可用如下方式实现:substr($str, 0, 30).chr(0). substr()函数可以分割文字,但要分割的文字如果包括中文字符往往会遇到问题,这时可以用mb_substr()/mb_strcut这个函 数,mb_substr()/mb_str

php 中文字符串截取方法解析

用PHP函数substr截取中文字符可能会出现乱码,主要是substr可能硬生生的将一个中文字符“锯”成两半.解决办法: 1.使用mbstring扩展库的mb_substr截取就不会出现乱码了. 2.自己书写截取函数,但效率不如用mbstring扩展库来得高. 3.如果仅是为了输出截取的串,可用如下方式实现:substr($str, 0, 30).chr(0). substr()函数可以分割文字,但要分割的文字如果包括中文字符往往会遇到问题,这时可以用mb_substr()/mb_strcut这

中文截取无乱码

/* *中文截取无乱码 */ function showsubstr_chinese($str, $start, $length = null) { return join("", array_slice( preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY), $start, $length)); }

php中文截取无乱码

<?php header('Content-Type:text/html;charset=utf-8'); function cutstr($str,$len){     if($len<0){return null;}     $chars = 0; //字符数量     $offset = 0;     $res = '';         while($chars < $len){             $high = decbin(ord(substr($str,$offset

java中文字符串截取

/** * author geksong <br/> * function 中文字符串相关操作<br/> **/ public class ChinaStringUtil { /** * 判断字符是不是中文字符 * @param c * @return */ public static boolean isChinese(char c) { int ascii = (int)c; if(ascii >= 0 && ascii <= 255) return