电话
400 9058 355
strlen() 返回字节数而非字符数,阿拉伯文UTF-8编码下每字符占2–4字节,故结果偏大;应使用mb_strlen($str, 'UTF-8')并显式指定编码,确保正确统计字符数。
strlen() 为什么对阿拉伯文返回错误长度?strlen() 统计的是字节数,不是字符数。阿拉伯文(如 "مرحبا")在 UTF-8 编码下每个字符占 2–4 字节,strlen() 会把一个阿拉伯字母算作多个“长度”,比如 strlen("مرحبا") 返回 12,而实际只有 6 个字符。
mb_strlen() 替代,但必须指定 'UTF-8'
PHP 的多字节函数能正确识别 Unicode 字符,但 mb_strlen() 默认使用 mb_internal_encoding() 的值——这个值可能不是 'UTF-8'(尤其在旧环境或未显式设置时),导致结果仍不准。
实操建议:
'UTF-8' 作为第二个参数:mb_strlen($str, 'UTF-8')
mb_internal_encoding(),它可能被其他代码修改,且不同 PHP 版本默认值不一致mb_detect_encoding($str, ['UTF-8', 'ISO-8859-1'], true) 验证编码,再转换:$str = mb_convert_encoding($str, 'UTF-8', 'auto')
仅靠长度不够,有时需确认字符串里**确实有阿拉伯字符**。正则最直接:
if (preg_match('/[\x{0600}-\x{06FF}]/u', $str)) {
// 含阿拉伯文区块字符(基本阿拉伯字母、数字、标点)
}
注意点:
/u 修饰符必不可少,否则 Unicode 范围匹配失效\x{0600}-\x{06FF} 覆盖标准阿拉伯语,但不含扩展字符(如 \x{08A0}-\x{08FF} 是阿拉伯补充),按需叠加mb_ereg(),该系列函数在 PHP 8.2+ 已废弃,且性能差mb_strlen() 比 strlen() 慢,因为要解析 UTF-8 字节流;但在处理含阿拉伯文、中文等多字节文本时,这是必须付出的代价。
容易忽略的细节:
mbstring 扩展,调用 mb_strlen() 会报 Fatal error: Uncaught Error: Call to undefined function mb_strlen()
extension_loaded('mbstring'),否则 fallback 方案(如用 iconv_strlen($str, 'UTF-8'))得提前准备好count(array_filter(str_split($str))) 这类“伪多字节”方案——它在 UTF-8 下完全不可靠
邮箱:8955556@qq.com
Q Q:8955556
本文详解如何将Go官方present工具(用于生成HTML5...
PySNMP在不同版本中对SNMP错误状态(errorSta...
time.Sleep仅阻塞当前goroutine,其他gor...
PHPfopen()创建含特殊符号的文件名失败主因是操作系统...
WooCommerce中通过代码为分组产品动态聚合子商品的属...
io.ReadFull返回io.ErrUnexpectedE...
本文详解Yii2中控制器向视图传递ActiveRecord数...
本文详解为何通过wp_set_object_terms()为...
Pytest中使用@mock.patch类装饰器会导致补丁泄...
带缓冲的channel是并发安全的FIFO队列;make(c...