PHP新版本中已弃用utf8_encode/utf8_decode的替代方案咨询
PHP新版本中已弃用utf8_encode/utf8_decode的替代方案咨询
嗨,这个问题我之前也碰到过!PHP 8.2及以后的版本确实把utf8_encode和utf8_decode标记为弃用了,核心原因是这两个函数的功能太局限——它们本质上只能处理ISO-8859-1(Latin-1)编码的字符串与UTF-8之间的转换,没法适配其他编码场景,所以官方推荐用更通用的多字节字符串函数来替代。
结合你用array_map处理数组项转UTF-8的场景,给你几个靠谱的替代方案:
1. 优先使用mb_convert_encoding(推荐)
mb_convert_encoding是PHP多字节扩展(mbstring)里的函数,支持几乎所有常见编码,稳定性也更好。如果你的源字符串确实是ISO-8859-1编码,修改后的代码可以写成:
$a[] = array_map(fn($str) => mb_convert_encoding($str, 'UTF-8', 'ISO-8859-1'), $item);
要是你的源字符串是其他编码(比如GBK、CP1252),只需要把第三个参数换成对应的编码就行,比如GBK转UTF-8:
mb_convert_encoding($str, 'UTF-8', 'GBK')
2. 用iconv作为备选
iconv也是常用的转码函数,功能和mb_convert_encoding类似,同样可以替代utf8_encode:
$a[] = array_map(fn($str) => iconv('ISO-8859-1', 'UTF-8', $str), $item);
不过要注意,iconv在处理一些特殊字符时可能会出现截断,所以还是优先推荐mb_convert_encoding。
额外提醒
- 最好先明确你的源字符串编码,避免转码出错。如果不确定编码,可以尝试用
mb_detect_encoding检测,但这个函数的结果不是100%准确,能确定的话尽量用明确的编码参数。 - 如果你需要反向转换(对应原来的
utf8_decode,把UTF-8转成ISO-8859-1),同样可以用mb_convert_encoding:mb_convert_encoding($str, 'ISO-8859-1', 'UTF-8')
备注:内容来源于stack exchange,提问作者Dmytro V
相关产品推荐
相关产品推荐

