用php截取中文字符串会出现各种问题,做一简单汇总,文中的问题暂时还未解决,有大神解决了问题欢迎指教
1 <?php
2
3 header('Content-Type:text/html;charset=utf-8');//页面采用utf-8编码
4 //header('Content-Type:text/html;charset=gbk');//页面采用gbk编码
5
6 /**
7 * 实现中文截取无乱码
8 * @param $str:要截取的字符串
9 * @param $start:开始位置
10 * @param $length:截取长度
11 * @return null|string
12 */
13 /*
14 测试失败
15 第一个函数:中文字符串截取会乱码
16 */
17 /*
18 function GbSubstring($string,$start,$length){
19 if(strlen($string)>$length){
20 $str=null;
21 $len=$start+$length;
22
23 for($i=$start;$i<$len;$i++){
24 if(ord(substr($string,$i,1))>0Xa0){
25 $str.=substr($string,$i,2);
26 $i++;
27
28 }else{
29 $str.=substr($str,$i,1);
30 }
31 }
32 return $str.'....';
33 }else{
34 return $string;
35 }
36
37 }
38
39 $str1= GbSubstring('哈哈哈你好啊啊',1,3);
40 echo $str1;
41 */
42
43 /*
44 第二个函数测试成功
45 */
46 /**
47 * 适用utf-8
48 * @param $str
49 * @param int $start
50 * @param $length
51 * @param string $charset
52 * @param bool|true $suffix
53 * @return string|void
54 */
55 /*
56 function msubstr($str, $start=0, $length, $charset="utf-8", $suffix=true)
57 {
58 if(function_exists("mb_substr"))
59 return mb_substr($str, $start, $length, $charset);
60 elseif(function_exists('iconv_substr')) {
61 return iconv_substr($str,$start,$length,$charset);
62 }
63 $re['utf-8'] = "/[x01-x7f]|[xc2-xdf][x80-xbf]|[xe0-xef][x80-xbf]{2}|[xf0-xff][x80-xbf]{3}/";
64 $re['gb2312'] = "/[x01-x7f]|[xb0-xf7][xa0-xfe]/";
65 $re['gbk'] = "/[x01-x7f]|[x81-xfe][x40-xfe]/";
66 $re['big5'] = "/[x01-x7f]|[x81-xfe]([x40-x7e]|xa1-xfe])/";
67 preg_match_all($re[$charset], $str, $match);
68 $slice = join("",array_slice($match[0], $start, $length));
69 if($suffix) return $slice."…";
70 return $slice;
71 }
72
73 echo msubstr('哈哈哈你好啊啊',1,3);
74 */
75
76 /*
77 第三个函数:测试出错
78 */
79 /**
80 * @param $string
81 * @param $start
82 * @param $length
83 * @return string
84 */
85 /*
86 function substr2($string, $start, $length)
87 {
88 $len = strlen($string);
89 if($len > $length)
90 {
91 $str = '';
92 $len1 = $start + $length; //截取到原字符串的位置
93 for($i=$start; $i<$len1; $i++)
94 {
95 if(ord(substr($string, $i, 2)) > 0xa0) //在ASCII中,0xa0表示汉字的开始
96 {
97 $str.=substr($string, $i, 2);
98 $i++;
99 }
100 else
101 {
102 $str.=substr($string, $i, 1);
103 }
104 }
105 return $str.'...';
106 }
107 else
108 {
109 return $string;
110 }
111 }
112 echo substr2('哈哈哈你好啊啊',1,3);
113 */
114
115 /*
116 第四个函数:测试出错
117 */
118 /*
119 function chinesesubstr($str, $start, $len){
120 $tmpstr=null;
121 $strlen = $start + $len;
122 for($i=0; $i<$strlen; $i++){
123 if(ord(substr($str, $i, 1)) > 0xa0){
124 $tmpstr .= substr($str, $i, 2);
125 $i++;
126 }else{
127 $tmpstr .= substr($str, $i, 1);
128 }
129 }
130 return $tmpstr;
131 }
132 $str = '哈哈哈你好啊啊';
133 echo chinesesubstr($str, 1,4);
134 */
135
136 /*
137 系统函数mb_substr测试成功
138 */
139 echo mb_substr('哈哈哈你好啊啊',1,4,"utf-8");
140
141 ?>