编写一个PHP中文截取无乱码的函数

saonian 发布于 02-26 14:09 已修改 323 点击
PHP截取字符串的函数是`substr`,但是此函数在截取包含中文字符串时,有可能发生乱码情况,因为utf-8下一个中文占3个字节,所以你可能截取了一个中文字符的一部分。 为了避免这种情况,我们需要自定义一个函数。字符串编码按utf-8对待。 ```php /** * 中文截取无乱码 * @param $str * @param $start * @param $length * @return string|null */ function mbSubStr($str, $start, $length) { // 最终返回的字符串 $resultStr = null; // 字符串的长度 $len = strlen($str); // 要截取的位置和对应位置长度的数组 $l2pMap = []; // 字符的下标[中文按一个字符对待] $index = 0; for ($i = 0; $i < $len; $i++) { $l2pMap[$index] = $i; $index++; if (ord(substr($str, $i, 1)) >= 0xa0) { $i += 2; } } // 真正要开始截取的位置 $realStartPosition = isset($l2pMap[$start]) ? $l2pMap[$start] : false; if (false === $realStartPosition) return $resultStr; // 截取拼接字符串 $realLength = $l2pMap[$start + $length]; for ($i = $realStartPosition; $i < $realLength; $i++) { if (ord(substr($str, $i, 1)) >= 0xa0) { $resultStr .= substr($str, $i, 3); $i += 2; } else { $resultStr .= substr($str, $i, 1); } } return $resultStr; } $str = "你好啊哈哈china"; $r1 = mbSubStr($str, 0, 6); $r2 = mb_substr($str, 0, 6); var_dump($r1, $r2); // string '你好啊哈哈c' (length=16) // string '你好啊哈哈c' (length=16) ``` 其实打开**php_mbstring**扩展后,可以使用`mb_substr`函数截取中文字符串,并且不会有乱码情况,上面的代码只是实现了和`mb_substr`函数一样的效果。
0 评论

请登录后发表评论

saonian

all or nothing, now or never.

文章
回复
粉丝