PHP字符串拼接时umlaut字符在浏览器显示异常该如何解决?
问题成因
- PHP的字符串底层是字节数组,使用
$string[$i]下标访问时,默认取的是第i个字节,而非第i个多字节字符。类似ö的元音变音属于UTF-8多字节字符,单个字符占2个字节,直接用下标访问会把完整字符拆成两个孤立的无效字节。 - 你使用
mb_strlen获取的是字符串的多字节字符总数,循环次数和字符数一致。当你不拼接空格时,拆分出来的单个字节会按顺序连续拼接,刚好能重新组合成有效的多字节字符,所以显示正常;一旦在字符间插入空格,拆分出来的多字节字符片段被空格隔开,无法组合为有效字符,浏览器就会显示乱码。
修复方案
要实现多字节字符和其他内容正常拼接,需要使用多字节安全的函数读取单个完整字符,不要直接用下标访问字节:
方案1:使用mb_substr读取单个字符(兼容低版本PHP)
$string = "apfelsaft siebenundvierzig zahnstocher gelb ethereum österreich"; // 显式指定编码避免环境差异问题 $l = mb_strlen($string, 'UTF-8'); $f = ''; // 注意原代码的<=会多取一次溢出的字节,改为<即可 for ($i = 0; $i < $l; $i++){ // 每次取1个完整的UTF-8字符 $singleChar = mb_substr($string, $i, 1, 'UTF-8'); $f .= $singleChar . " "; } var_dump($f);
方案2:使用mb_str_split拆分字符数组(PHP 7.4及以上版本推荐)
直接将字符串拆分为多字节字符数组,再用implode拼接间隔符,代码更简洁:
$string = "apfelsaft siebenundvierzig zahnstocher gelb ethereum österreich"; $charArray = mb_str_split($string, 1, 'UTF-8'); $f = implode(' ', $charArray); var_dump($f);
额外注意事项
请确保PHP源文件本身保存为UTF-8无BOM格式,同时输出HTTP响应头时指定编码header('Content-Type: text/html; charset=utf-8');,避免浏览器识别编码错误导致的额外乱码问题。
内容的提问来源于stack exchange,提问作者user1711384
相关产品推荐
相关产品推荐

