php处理越南文需全程utf-8一致:strlen()应换mb_strlen(),preg_match()加/u并用\p{l},mb_substr()须指定'utf-8'编码,html与表单需声明utf-8,数据库连接要设charset=utf8mb4。

strlen() 在越南文字符串上会返回错误长度
PHP 的 strlen() 按字节计数,而越南文含大量 UTF-8 多字节字符(如 đ、ơ、ư),一个字符可能占 2–3 字节。直接用 strlen() 判定“字符个数”必然出错。
例如:"đủ" 实际是 4 字节(đ=2字节,ủ=2字节),但只有 2 个字符——strlen("đủ") 返回 4,而非预期的 2。
- 必须改用
mb_strlen($str, 'UTF-8')获取真实字符数 - 确保脚本文件本身保存为 UTF-8 无 BOM 格式
- 若从数据库读取,确认连接层已设 UTF-8(如 PDO DSN 加
;charset=utf8mb4)
preg_match() 匹配越南文时正则失效
默认 PCRE 不支持 Unicode 属性,/^[a-zàáạảãâầấậẩẫăằắặẳẵđèéẹẻẽêềếệểễìíịỉĩòóọỏõôồốộổỗơờớợởỡùúụủũưừứựửữỳýỵỷỹ\s]+$/i 这类手动列字符的方式极易漏写、难维护,且大小写不敏感标志 i 对越南文无效。
正确做法是启用 Unicode 模式并使用 \p{L}:
立即学习“PHP免费学习笔记(深入)”;
if (!preg_match('/^\p{L}+$/u', $str)) {
// 非纯越南文/拉丁字母字符
}
-
/u修饰符强制 PCRE 以 UTF-8 解析模式和字符串 -
\p{L}匹配任意 Unicode 字母(含越南文所有带调号字母) - 避免手写字符集——
đ和Đ是两个独立码点,mb_strtoupper()才能正确转换大小写
mb_substr() 截断越南文时出现乱码
用 substr() 截取越南文字符串,极易在多字节字符中间切断,导致后续输出显示 或乱码。比如 substr("tối", 0, 3) 可能切掉 ối 的第一个字节,留下残缺字节序列。
- 一律改用
mb_substr($str, $start, $length, 'UTF-8') - 第 4 个参数不可省略,否则依赖默认内部编码(可能不是 UTF-8)
- 注意:
$length单位是字符数,不是字节数 - 若需兼容 PHP 7.4 以下版本,检查
mb_internal_encoding()是否已设为'UTF-8'
表单提交或 URL 参数中的越南文变问号或方块
这不是 PHP 层问题,而是 HTTP 层未声明字符集。浏览器按 ISO-8859-1 解析表单,导致越南文字节被错误解释。
- HTML 页面
中必须有:<meta charset="UTF-8"> - 表单显式声明:
<form accept-charset="UTF-8"></form> - PHP 接收后,用
mb_convert_encoding($_POST['text'], 'UTF-8', 'auto')做兜底(仅限无法控制前端时) - Apache 配置中避免
AddDefaultCharset覆盖为非 UTF-8
越南文处理的复杂点不在函数调用本身,而在整个链路的编码一致性——从编辑器保存、HTML 声明、HTTP 头、数据库连接到 PHP 内部函数,任一环节掉链子,都会让 mb_* 函数前功尽弃。











