background image

 

// 判断后 6 字节是否符合 utf8

 

规则

$ord0

 = ord( 

$res

[0] ); 

if

 ( 128 <= 

$ord0

 && 191 >= 

$ord0

 ){ 

// 

 

往后截取 , 并加在 res 的前面. 

if

 ( preg_match( '@[\xC0-\xFD][\x80-\xBF]{0,5}$@' , 

$prev_segm

 , 

$bytes

 ) ){ 

if

 ( !

empty

$bytes

[0] ) ){ 

$bytes

 = 

$bytes

[0]; 

$res

 = 

$bytes

 . 

$res



return

 

$res


 
测试数据:: 
代码如下:
 
<?php 

$str

 = 'dfjdjf 测 13f 试 65&2 数据fdj(1 就 mfe&……就'; 

var_dump( utf8_substr( 

$str

 , 22 , 12 ) ); 

echo

 ' <br /> '; 

var_dump( utf8_substr( 

$str

 , 22 , -6 ) ); 

echo

 ' <br /> '; 

var_dump( utf8_substr( 

$str

 , 9 , 12 ) ); 

echo

 ' <br /> '; 

var_dump( utf8_substr( 

$str

 , 19 , 12 ) ); 

echo

 ' <br /> '; 

var_dump( utf8_substr( 

$str

 , 28 , -6 ) ); 

echo

 ' <br /> '; 

 
显示结果::(截取无乱码, 欢迎大家测试, 提交 bug) 
string(12) "据fdj" 
string(26) "据fdj(1 就 mfe&…" 
string(13) "13f 试 65&2 数" 
string(12) "数据fd" 
string(20) "dj(1 就 mfe&…"