php 8.1 中应使用 mb_strlen($str, 'gbk') 获取 gbk 字符串真实字符数,避免 strlen();截取需用 mbsubstr($str, 0, n, 'gbk'),所有多字节操作均须用 mb* 函数。

PHP 8.1 判断 GBK 编码字符串长度,核心是避免用 strlen()(它只算字节),而要按“字符个数”统计——GBK 中一个中文占 2 字节、一个英文占 1 字节,混合时不能简单除以 2。
直接用 mb_strlen() 指定编码
最稳妥的方式是启用 mbstring 扩展(PHP 8.1 默认已开启),然后显式传入 'GBK' 编码:
-
mb_strlen($str, 'GBK')返回真实字符数,例如'你好ABC'返回5 - 确保字符串确实是 GBK 编码,否则结果不可靠;可先用
mb_detect_encoding()辅助验证 - 若不确定编码,建议统一转为 UTF-8 再处理,避免后续兼容问题
手动遍历判断(不推荐,仅作理解)
通过字节特征识别 GBK 字符边界:GBK 单字节范围是 \x00–\x7F(ASCII),双字节首字节在 \xA1–\xFE,次字节在 \xA1–\xFE。可写循环逐字节扫描:
- 遇到
\x00–\x7F算 1 个字符 - 遇到
\xA1–\xFE就跳过下一个字节,计 1 个字符 - 该逻辑易出错,且不处理非法字节序列,实际项目中应避免手写
注意编码检测的局限性
mb_detect_encoding($str, ['GBK', 'UTF-8'], true) 可尝试识别,但 GBK 和 UTF-8 在部分字节上存在重叠,短文本或纯英文时容易误判:
- 检测结果为
false或'UTF-8'不代表一定不是 GBK - 若来源明确(如旧系统导出、Windows 记事本 ANSI 保存),应以业务上下文为准,而非依赖自动检测
- 检测后建议用
mb_convert_encoding($str, 'UTF-8', 'GBK')转换再统一处理
截取 GBK 字符串也必须用 mb_substr
如果需要截取前 N 个字符(比如显示摘要),同样不能用 substr():
-
mb_substr($str, 0, 10, 'GBK')安全截取 10 个字符,不会出现乱码 -
substr($str, 0, 10)可能在中文中间截断,导致后续显示异常 - 所有多字节操作(查找位置、替换、大小写转换)都应使用对应
mb_*函数
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











