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 属性或范围:
将一个或多个 UI 原型图、线框图、产品截图或设计稿转换为标准化、可直接交付的 PRD 风格文档,供产品、设计、前端和测试共同使用。适用于 Codex 需要分析 PC 网页、桌面端、移动端、响应式页面、独立弹窗、表单、表格、看板、数据大屏或多页面流程截图,还原页面结构与交互,强制套用固定文档模板,抽取跨页面共享规则,或把一组原型沉淀为单页规范文档加整体业务流程文档的场景。不适用于纯视觉审美点评、代码实现、接口设计、埋点方案、竞品分析或无 UI 输入的业务需求创作。
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,都会让长度、截取、匹配全部失效,而且错误表现往往延迟到数据进入前端才暴露。


















