mb_strlen($str, 'UTF-8')是处理亚美尼亚文字符串长度的唯一可靠方案,必须显式指定UTF-8编码,且需确保mbstring扩展已启用,否则会致命报错。

mb_strlen() 是唯一可靠方案
PHP 默认的 strlen() 按字节计数,亚美尼亚文(Unicode 范围 U+0530–U+058F、U+0590–U+05FF)在 UTF-8 下占 2–3 字节,strlen() 会把一个字符算成多个“长度”,完全不可用。
必须用多字节函数:mb_strlen($str, 'UTF-8')。注意第二个参数不能省略——即使 mb_internal_encoding() 已设为 UTF-8,显式传入 'UTF-8' 可避免因配置差异导致的误判。
- 不传编码时,
mb_strlen($str)依赖内部编码,线上环境可能和本地不一致 - 若字符串实际不是 UTF-8 编码(比如 GBK 混入),先用
mb_convert_encoding($str, 'UTF-8', 'auto')转换再测长 - 亚美尼亚文标点(如 « » 、՝ 、։)同样属于 Unicode 字符,
mb_strlen()一并正确计为 1
警惕 mb_substr() 截断时的边界问题
用 mb_substr() 按“视觉长度”截取亚美尼亚文字符串时,起始位置和长度都得是字符偏移量,不是字节偏移。例如想取前 5 个亚美尼亚字符:
$first5 = mb_substr($armenian_str, 0, 5, 'UTF-8');
常见错误是混用 substr() 或漏写第 4 个编码参数,结果截出乱码或少字。
立即学习“PHP免费学习笔记(深入)”;
-
substr($str, 0, 5)可能切在某个亚美尼亚字符的中间字节上,输出无效 UTF-8 - 第 3 个参数(长度)是字符数,不是字节数;哪怕第 5 个字符占 3 字节,
mb_substr()也能完整取出 - 如果要从第 10 个字符开始截 3 个,写
mb_substr($str, 10, 3, 'UTF-8'),别用10 * 3算字节偏移
验证字符串是否含亚美尼亚文字符
单纯判断“有没有亚美尼亚文”,比计算长度更常被忽略。可用正则配合 Unicode 属性或范围:
if (preg_match('/[\x{0530}-\x{058F}\x{0590}-\x{05FF}]/u', $str)) { ... }注意必须加 /u 修饰符,否则 PCRE 不识别 \x{} 中的 Unicode 码点。
- 范围
\x{0530}-\x{058F}覆盖大写亚美尼亚字母,\x{0590}-\x{05FF}覆盖小写及标点 - 不要用
mb_ereg()—— 它已废弃且不支持 \x{} 写法 - 若需区分“纯亚美尼亚文”和“混排”,可改用
!preg_match('/^[\\x{0530}-\\x{058F}\\x{0590}-\\x{05FF}]+$/u', $str)
mb_string 扩展未启用会导致静默失败
很多 PHP 环境(尤其旧版 Docker 镜像或精简编译)默认不启用 mbstring 扩展。此时调用 mb_strlen() 会直接报 Fatal error: Uncaught Error: Call to undefined function mb_strlen(),而不是返回错误值。
上线前务必检查:
php -m | grep mbstring
或在代码中加兜底:
if (!function_exists('mb_strlen')) {
throw new RuntimeException('mbstring extension is required for Armenian text handling');
}- Apache + mod_php 和 CLI 的扩展启用状态可能不同,需分别确认
- Dockerfile 中记得加
docker-php-ext-install mbstring - 不要依赖
@mb_strlen()抑制错误——它不会让函数变可用,只会掩盖问题
亚美尼亚文处理的关键不在“怎么写”,而在“每一步是否强制指定 UTF-8 编码”——漏掉任何一个 'UTF-8' 参数或没开 mbstring,都会让长度、截取、匹配全部失效,而且错误表现往往延迟到数据进入前端才暴露。











