PHP汉字截取函数:UTF-8与GB2312编码兼容
67 浏览量
更新于2024-09-01
收藏 46KB PDF 举报
"PHP 截取字符串专题集合"
在PHP中,截取字符串是一项常见的操作,尤其是在处理用户输入、显示文本片段或格式化数据时。然而,由于不同的字符编码(如UTF-8和GB2312)的存在,简单地使用内置函数可能无法正确处理中文字符。这里我们将详细讨论如何编写一个兼容UTF-8和GB2312编码的汉字截取函数,并解释其工作原理。
首先,我们来看给定的PHP代码:
```php
function cut_str($string, $sublen, $start=0, $code='UTF-8') {
if ($code == 'UTF-8') {
// 此部分用于处理UTF-8编码
$pa = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|\xe0[\xa0-\xbf][\x80-\xbf]|[\xe1-\xef][\x80-\xbf][\x80-\xbf]|\xf0[\x90-\xbf][\x80-\xbf][\x80-\xbf]|[\xf1-\xf7][\x80-\xbf][\x80-\xbf][\x80-\xbf]/";
preg_match_all($pa, $string, $t_string);
if (count($t_string[0]) - $start > $sublen)
return join('', array_slice($t_string[0], $start, $sublen))."…";
return join('', array_slice($t_string[0], $start, $sublen));
} else {
// 此部分用于处理GB2312编码
$start = $start * 2;
$sublen = $sublen * 2;
$strlen = strlen($string);
$tmpstr = '';
for ($i = 0; $i < $strlen; $i++) {
if ($i >= $start && $i < ($start + $sublen)) {
if (ord(substr($string, $i, 1)) > 129) {
$tmpstr .= substr($string, $i, 2);
} else {
$tmpstr .= substr($string, $i, 1);
}
}
if (ord(substr($string, $i, 1)) > 129) $i++;
}
if (strlen($tmpstr) < $strlen) $tmpstr .= "…";
return $tmpstr;
}
}
```
这个函数`cut_str`接受四个参数:待截取的字符串`$string`,要截取的长度`$sublen`,起始位置`$start`,以及编码类型`$code`(默认为UTF-8)。函数首先检查字符串的编码,然后根据不同的编码进行处理。
对于UTF-8编码,它使用正则表达式`$pa`匹配UTF-8中的单字节和多字节字符。`preg_match_all`函数会找出所有匹配的字符,然后使用`array_slice`取出指定范围内的字符,最后拼接成新的字符串。如果截取的字符数超过`$sublen`,还会加上省略号"…"。
对于GB2312编码,由于GB2312中的中文字符是双字节的,所以`$start`和`$sublen`都要乘以2。函数通过遍历字符串,判断每个字符的ASCII值是否大于129来确定是否为中文字符,并进行截取。同样,如果截取的长度不足,也会添加省略号。
需要注意的是,此函数仅适用于纯UTF-8或GB2312编码的字符串。如果字符串中混合了多种编码,可能会导致错误。在实际应用中,最好先确保字符串的编码一致性,或者使用更复杂的库(如iconv或mbstring)来处理多编码环境。
此外,当处理多字节字符集(如UTF-8)时,应谨慎使用内置函数如`strlen`,因为它们通常只计算字节而不是字符数。在上面的函数中,当处理GB2312编码时,就使用了`strlen`来获取字符串的字节数,而在处理UTF-8时,则依赖正则表达式来计算字符数。
总结来说,这个PHP函数提供了一种灵活的方式来截取不同编码的字符串,尤其是在处理中文字符时能避免出现乱码问题。不过,它不适用于混合编码的字符串,且没有考虑其他编码格式,如GBK或BIG5。在实际项目中,可能需要进一步扩展这个函数,使其更加健壮和通用。
点击了解资源详情
点击了解资源详情
点击了解资源详情
2019-04-21 上传
2019-06-10 上传
2020-10-24 上传
2021-12-24 上传
2015-06-01 上传
2023-07-05 上传
weixin_38618315
- 粉丝: 1
- 资源: 920
最新资源
- 全国江河水系图层shp文件包下载
- 点云二值化测试数据集的详细解读
- JDiskCat:跨平台开源磁盘目录工具
- 加密FS模块:实现动态文件加密的Node.js包
- 宠物小精灵记忆配对游戏:强化你的命名记忆
- React入门教程:创建React应用与脚本使用指南
- Linux和Unix文件标记解决方案:贝岭的matlab代码
- Unity射击游戏UI套件:支持C#与多种屏幕布局
- MapboxGL Draw自定义模式:高效切割多边形方法
- C语言课程设计:计算机程序编辑语言的应用与优势
- 吴恩达课程手写实现Python优化器和网络模型
- PFT_2019项目:ft_printf测试器的新版测试规范
- MySQL数据库备份Shell脚本使用指南
- Ohbug扩展实现屏幕录像功能
- Ember CLI 插件:ember-cli-i18n-lazy-lookup 实现高效国际化
- Wireshark网络调试工具:中文支持的网口发包与分析