如何在PHP中正确打印ñ、é等特殊字符?
问题原因
UTF-8编码下,ñ、é这类非ASCII字符占2个字节,PHP原生的字符串下标访问(比如$letters[1])是按字节而非字符定位的,所以你取到的是第一个字符ñ的第二个字节,属于无效的UTF-8序列,输出就会显示�。
解决办法
方法1:使用多字节安全的截取函数(推荐)
利用mb_substr函数(需确保PHP启用了mbstring扩展,绝大多数环境默认开启),它能按字符而非字节处理字符串:
<?php // 先设置输出编码为UTF-8,避免页面显示乱码 header('Content-Type: text/html; charset=utf-8'); $letters='ñéáóúí'; // 参数:字符串、起始字符位置、截取长度、编码 $targetLetter = mb_substr($letters, 0, 1, 'UTF-8'); echo $targetLetter; // 输出ñ ?>
如果要取第二个字符é,把起始位置改成1即可:mb_substr($letters, 1, 1, 'UTF-8')。
方法2:将字符串转为多字节数组(PHP 7.4+)
使用mb_str_split直接把字符串拆成单个字符的数组:
<?php header('Content-Type: text/html; charset=utf-8'); $letters='ñéáóúí'; $letterArray = mb_str_split($letters, 1, 'UTF-8'); echo $letterArray[0]; // 输出ñ echo $letterArray[1]; // 输出é ?>
方法3:兼容旧版本PHP的数组转换方式
如果你的PHP版本低于7.4,可以通过编码转换间接实现:
<?php header('Content-Type: text/html; charset=utf-8'); $letters='ñéáóúí'; // 转成UTF-16LE(每个字符占2字节) $utf16Str = mb_convert_encoding($letters, 'UTF-16LE', 'UTF-8'); // 按2字节拆分数组 $letterArray = str_split($utf16Str, 2); // 转回UTF-8 $targetLetter = mb_convert_encoding($letterArray[0], 'UTF-8', 'UTF-16LE'); echo $targetLetter; // 输出ñ ?>
额外注意事项
- 确保你的PHP文件本身以UTF-8无BOM格式保存,否则字符串内容可能在定义时就已经乱码。
- 页面输出时必须指定UTF-8编码,要么用PHP的
header函数,要么在HTML中添加<meta charset="UTF-8">标签。
内容的提问来源于stack exchange,提问作者Kns
相关产品推荐
相关产品推荐

