php截取等长UFT8中英⽂混合字串
由于需要,想实现“php截取等长UFT8中英⽂混合字串”,可是⽹上了很多代码不是有乱码就是不能实现等长(以⼀个中⽂长度为单位,两个英⽂字母算⼀个长度,如‘等长’长度为2,‘UTF8’长度也是2)。
由于utf8编码时,中⽂为三个字节,英⽂为⼀个字节,⽤substr就会出现乱码,⽤mb_substr会出现上⾯的不等长问题,但不会有乱码;
我以字节为单位进⾏操作,简单实现了⼀个⼩程序。
只能在utf8编码是使⽤。
Php代码
/*utf8编码时截取等长中英⽂字串*///英⽂标点[.,\"\\?!:_']
<?
function substr_utf8($string,$start,$length)
{      //by aiou
$chars = $string;
lua字符串转数组
//echo $string[0].$string[1].$string[2];
$i=0;
do{
if (preg_match ("/[0-9a-zA-Z]/", $chars[$i])){//纯英⽂
$m++;
}
else {$n++;    }//⾮英⽂字节,
$k = $n/3+$m/2;
$l = $n/3+$m;//最终截取长度;$l = $n/3+$m*2?
$i++;
} while($k < $length);
$str1 = mb_substr($string,$start,$l,'utf-8');//保证不会出现乱码
return$str1;
}
测试结果:
Php代码
$string = '第⼀次截取,mb_substr返回的是字符串宽度是按“字”来计算';
$string1 = '第⼀次截取,返回的是字符串宽度是按“字”来计算';
$string2 = '第A⼀D次截取,返回的12345是字符串宽度是按“字”来计算';
1.
Php代码
echo substr_utf8($string,0,1).'<br/>';
echo substr_utf8($string,0,2).'<br/>';
echo substr_utf8($string,0,3).'<br/>';
echo substr_utf8($string,0,4).'<br/>';
echo substr_utf8($string,0,5).'<br/>';
echo substr_utf8($string,0,6).'<br/>';
echo substr_utf8($string,0,7).'<br/>';
echo substr_utf8($string,0,8).'<br/>';
echo substr_utf8($string,0,9).'<br/>';
echo substr_utf8($string,0,10).'<br/>';
echo substr_utf8($string,0,11).'<br/>';
echo substr_utf8($string,0,12).'<br/>';
echo substr_utf8($string,0,13).'<br/>';
echo substr_utf8($string,0,14).'<br/>';
echo substr_utf8($string,0,15).'<br/>';
echo substr_utf8($string,0,16).'<br/>';
echo substr_utf8($string,0,17).'<br/>';
echo substr_utf8($string,0,18).'<br/>';
echo substr_utf8($string,0,19).'<br/>';
echo substr_utf8($string,0,20).'<br/>';
第⼀
第⼀次
第⼀次截
第⼀次截取
第⼀次截取,
第⼀次截取,mb
第⼀次截取,mb_s
第⼀次截取,mb_sub
第⼀次截取,mb_subst
第⼀次截取,mb_substr
第⼀次截取,mb_substr返
第⼀次截取,mb_substr返回
第⼀次截取,mb_substr返回的
第⼀次截取,mb_substr返回的是
第⼀次截取,mb_substr返回的是字
第⼀次截取,mb_substr返回的是字符
第⼀次截取,mb_substr返回的是字符串
第⼀次截取,mb_substr返回的是字符串宽
第⼀次截取,mb_substr返回的是字符串宽度
2.
Java代码
$ss='1234567890abcdefghijklmnopqrst';
echo Utf8Helper::substr_utf8($ss,0,1).'<br/>';
echo Utf8Helper::substr_utf8($ss,0,2).'<br/>';
echo Utf8Helper::substr_utf8($ss,0,3).'<br/>';
echo Utf8Helper::substr_utf8($ss,0,4).'<br/>';
echo Utf8Helper::substr_utf8($ss,0,5).'<br/>';
echo Utf8Helper::substr_utf8($ss,0,6).'<br/>';
echo Utf8Helper::substr_utf8($ss,0,7).'<br/>';
echo Utf8Helper::substr_utf8($ss,0,8).'<br/>';
echo Utf8Helper::substr_utf8($ss,0,9).'<br/>';
echo Utf8Helper::substr_utf8($ss,0,10);
12
1234
123456
12345678
1234567890
1234567890ab
1234567890abcd
1234567890abcdef
1234567890abcdefgh
1234567890abcdefghij
长度都以汉字数为基准。
基本上每两个英⽂字母、数字、英⽂标点算作⼀个汉字长度。看上去效果还不错。改进⼀下还可以做其它编码下的。
效率没做测试,还没有这概念。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。