php 实现中文字串截取无乱码的方法
封面图
•
2025-10-15
•
PHP
176
0
0
0
在 PHP 中,如果直接使用 `substr()` 函数截取中文字符串,可能会出现乱码或字符截断的问题,因为 `substr()` 是按字节(byte)来截取的,而中文字符通常占用多个字节(如 UTF-8 编码下每个汉字占 3 个字节)。 为了正确地截取中文字符串而不出现乱码,可以使用以下几种方法: --- ## ✅ 方法一:使用 `mb_substr()`(推荐) `mb_substr()` 是多字节字符串安全的函数,支持 Unicode 编码(如 UTF-8)。 ```php $str = "这是一个测试字符串,用于演示中文字串截取。"; $length = 10; // 截取前10个字符 $result = mb_substr($str, 0, $length, 'UTF-8'); echo $result; ``` **输出:** ``` 这是一个测试 ``` ### 参数说明: - 第一个参数:原始字符串 - 第二个参数:起始位置 - 第三个参数:要截取的长度(字符数) - 第四个参数:编码格式(如 'UTF-8') --- ## ✅ 方法二:使用 `iconv` + `substr`(不推荐,但可用) 如果你不能使用 `mb_substr()`,也可以使用 `iconv` 转换编码后使用 `substr`,但不如 `mb_substr` 方便和安全。 ```php $str = "这是一个测试字符串,用于演示中文字串截取。"; $length = 10; // 先转换为 GBK 编码(假设原编码是 UTF-8) $gbkStr = iconv('UTF-8', 'GBK//IGNORE', $str); $gbkSub = substr($gbkStr, 0, $length * 3); // 每个汉字占3字节 $result = iconv('GBK', 'UTF-8//IGNORE', $gbkSub); echo $result; ``` > ⚠️ 注意:这种方法容易出错,建议优先使用 `mb_substr()`。 --- ## ✅ 方法三:使用 `preg_replace` 截取(适合特殊场景) ```php function mb_substr($str, $start, $length) { return preg_replace('/^.*?(.{'.$length.'})/s', '$1', mb_substr($str, $start, $length, 'UTF-8')); } ``` 不过这个方法其实没有比 `mb_substr` 更好,建议还是用第一种方式。 --- ## ✅ 总结 | 方法 | 是否推荐 | 说明 | |------|----------|------| | `mb_substr()` | ✅ 推荐 | 多字节安全,支持 UTF-8 等编码 | | `iconv + substr` | ❌ 不推荐 | 麻烦且容易出错 | | `preg_replace` | ❌ 不推荐 | 不如 `mb_substr` 直观 | --- 如果你的 PHP 环境不支持 `mb_substr()`,请确保已开启 `mbstring` 扩展: ```bash sudo apt-get install php-mbstring # Debian/Ubuntu sudo yum install php-mbstring # CentOS/RHEL ``` 然后重启 Apache 或 Nginx。 --- 如有需要,我也可以提供带省略号(...)的截断函数。是否需要?
上一篇:
PHP数字金额转大小格式,同时说明思路
下一篇:
用PHP写出显示客户端IP与服务器IP的代码
标题录入,一次不能超过6条
留言
评论