mb_strlen 功能:获取字符串长度,主要是指非ascii编码的字符串。
代码:
<?php
$str = '北京1你好abc';
function my_strlen($str) {
$i = 0;
$count = 0;
$len = strlen($str);
while ($i < $len) {
$chr = ord($str[$i]);
$i++;
$count++;
if ($chr & 0x80) {
$chr <<= 1;
//此处使用的原理为utf-8格式编码决定的。
//当字节的第一位为0 则表示该字符为单字节文字,即ascii, 后面有多少个1就表示字符占用多少个字节。。
while ($chr & 0x80) {
$i++;
$chr <<= 1;
}
echo '$i = ' . $i, "\n";
}
}
return $count;
}
主要实现原理采用的是utf-8格式编码的规则。
如果一个字节的第一位是0,则这个字节单独就是一个字符;如果第一位是1,则连续有多少个1,就表示当前字符占用多少个字节。
另外还可以使用正则表达式的方式实现。
<?php
$str = '北京1你好abc';
function my_strlen($str) {
return count(preg_split('//u', $str, -1, PREG_SPLIT_NO_EMPTY));
}
echo my_strlen($str), "\n";
strrev 功能:反转字符串
当使用strrev时,如果是英文字符反转功能正常 ,而中文字符会出现乱码。 而mb库中并没有相应的处理方式。
我们需要手动实现一个,
方法1, 使用正则表达式,分割字符串 进行转置。
$arr = preg_split('//u', $str);
$arr = array_reverse($arr);
$str = join('', $arr);
方法2. 使用上一个原则的特点 自定义函数
function mb_strrev($str)
{
$length = strlen($str);
$returnStr = [];
for ($i = 0; $i < $length; $i++)
{
$chr = ord($str[$i]);
if ($chr & 0x80)
{
$chr <<=1;
$j = 0;
while ($chr & 0x80) {
$j++;
$i++;
$chr <<= 1;
}
for ($k = 0; $k <= $j; $k++)
{
array_unshift($returnStr, $str[$i - $k]);
}
} else {
array_unshift($returnStr, $str[$i]);
}
}
return join('', $returnStr);
}