PHP的utf8_en/decode已经不再使用,我应该使用什么?

14

我的网站页面中有90%使用utf8编码特性来编译数据表格。

$a[] = array_map('utf8_encode', $item);

在旧版本的php 8.0中一切都很好,但在新版本中,当$item($item是一个数组)的值为空时,它会给出一个错误。

有什么有效的替代方案吗?


1
$item 初始是否为 ISO 编码?此外,it gives me an error 是准确的还是一个弃用通知?请添加信息。 - user3783243
utf8_encode 要求一个非空字符串。因此,需先准备好数组,并将所有的 NULL 转换为空字符串 array_map('strval', $item) 或过滤掉 NULL 值 array_filter() - Foobar
utf8_encode 函数并未检查编码类型,而是假定为 ISO-8859-1 编码。这会导致错误和 bug。更好的解决方案是使用 mbstring 插件。mb_convert_encoding 函数不仅可以进行转换,还可以指定您要转换的编码类型。 - C Miller
3个回答

17
我们知道自 PHP 8.2.0 起,utf8_encode已经被弃用,并将在PHP 9中删除。https://php.watch/versions/8.2/utf8_encode-utf8_decode-deprecated 因此,替代方法可以是:
$oldSample = ["\x5A\x6F\xEB"];
$result= array_map
(
    function ($item){
        return mb_convert_encoding($item, "UTF-8", mb_detect_encoding($item));
    }, 
    $oldSample
);
var_dump($result);

Documentation:


2
可以缩短为: array_map(fn($item) => mb_convert_encoding($item, "UTF-8", mb_detect_encoding($item)), $oldSample); - jonlink

8

使用mb_convert_encoding函数将ISO-8859-1编码转换为UTF-8编码。

示例:

$iso = "\x5A\x6F\xEB";
echo mb_convert_encoding($iso, 'UTF-8', 'ISO-8859-1'); // Zoë

-3

我只是在执行array_map('utf8_encode', $item)之前做了这个:

foreach(array_keys($item) as $key)
    $item[$key] = utf8_encode($item[$key] ?? '');

它运行得很好。


1
请注意,自PHP 8.2.0起,utf8_encode已被弃用,并将在PHP 9中删除。 - simon.ro
3
这个问题特别关注的是如何替换你所推荐的已弃用函数。如果你抑制了通知/错误,你将不会收到弃用通知,但你的代码将会崩溃,而且没有任何提示原因。这是一个糟糕的建议。 - jonlink
@jonlink 很有趣,他选择了自己的回复。 - Eugene Kaurov
这个功能已经被弃用了,所以你才问这个问题。但是你却给出了同样的函数来使用它! - ÄR Âmmãř Żąîñh
这个功能已经被弃用了,这就是你问这个问题的原因。但是你给了同样的函数来使用它! - undefined
如果你不是在处理无法一夜之间重构的大型遗留网络应用程序,那么轻易说“注意utf_encode...已弃用...php 8.2...等等”就太容易了。每种情况都是不同的。同样,说“远离php 8.2”也是同样合理的。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接