PHP存储波兰语字符变量时单字符输出显示�乱码问题
问题原因
PHP原生的字符串下标访问(即$string[数字]语法)是按字节为单位寻址的,不支持多字节字符的直接定位。
你当前场景里网页使用UTF-8编码,ś、ż、ć这类波兰语特殊字符每个占2个字节,直接用$nam[1]取到的只是某个多字节字符的中间单个字节,属于不完整的字符片段,浏览器解析时就会显示�乱码。
而直接echo整个字符串时,PHP会把完整的字节流全部输出给浏览器,浏览器可以按照UTF-8编码规则正确拼接解析连续的多字节序列,所以完整输出时显示正常。
修复方案
- 先确认PHP环境开启了
mbstring多字节字符串扩展,这是PHP官方提供的专门处理多字节编码文本的扩展 - 所有涉及多字节字符串的单字符读取、截取、长度计算、位置查找操作,都替换为
mb_*系列函数,不要用原生的字符串下标、strlen()、substr()等单字节函数。 - 取单个字符时使用
mb_substr()函数,明确指定编码为UTF-8即可。
修正后的代码如下:
// 先统一输出编码,避免链路编码不一致 header('Content-Type: text/html; charset=utf-8'); function ech($nam) { echo $nam; echo "</br>"; // 参数说明:原字符串、起始位置(从0开始计数)、截取长度、编码 echo mb_substr($nam, 1, 1, 'UTF-8'); } $te = $_POST['sth']; // 当前值为"śżć" ech($te);
额外注意事项
- 统计多字节字符串的字符长度时,用
mb_strlen($str, 'UTF-8')替代strlen($str),后者返回的是字节数不是字符数 - 确保整个编码链路统一:PHP文件本身保存为UTF-8无BOM格式、数据库存储(如果用到)也设置为UTF-8编码,避免其他环节出现乱码
内容的提问来源于stack exchange,提问作者donefun
相关产品推荐
相关产品推荐

