You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 09:24:13