大家在自己的程序中相信都会经常用到截取字符串吧,但是往往遇到截取中文字符串的时候会遇到乱码的问题。很是让人头疼,接下来介绍两种方法防止截取中文字符串的时候出现乱码的问题。
首先第一种,自己写好的一个函数方便使用
利用这个函数截取就不会出现乱码了。
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
|
/** * 支持中文字符串截取 */ function msubstr( $str , $start =0, $length , $charset = "utf-8" , $suffix =true){ switch ( $charset ){ case 'utf-8' : $char_len =3; break ; case 'UTF8' : $char_len =3; break ; default : $char_len =2; } //小于指定长度,直接返回 if ( strlen ( $str )<=( $length * $char_len )){ return $str ; } if (function_exists( "mb_substr" )){ $slice = mb_substr( $str , $start , $length , $charset ); } else if (function_exists( 'iconv_substr' )){ $slice =iconv_substr( $str , $start , $length , $charset ); } else { $re [ 'utf-8' ] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/" ; $re [ 'gb2312' ] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/" ; $re [ 'gbk' ] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/" ; $re [ 'big5' ] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/" ; preg_match_all( $re [ $charset ], $str , $match ); $slice = join( "" , array_slice ( $match [0], $start , $length )); } if ( $suffix ) return $slice ; return $slice ; } |
第二种是php内置的一个函数mb_substr函数
指定要截取的字符串的编码格式,就能有效的防止出现乱码了。
说明
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
string mb_substr ( string $str , int $start [, int $length [, string $encoding ]] ) <?php function substr_unicode( $str , $s , $l = null) { return join( "" , array_slice ( preg_split( "//u" , $str , -1, PREG_SPLIT_NO_EMPTY), $s , $l )); } $str = "Büyük" ; $s = 0; // start from "0" (nth) char $l = 3; // get "3" chars echo substr ( $str , $s , $l ) . "\n" ; echo mb_substr( $str , $s , $l ) . "\n" ; echo substr_unicode( $str , $s , $l ); ?> |
以上所述就是本文的全部内容了,希望大家能够喜欢。