出于什么原因,htmlspecialchar()默认字符集从ISO-8859-1更改为UTF8

时间:2014-04-10 16:44:20

标签: php

根据http://php.net/htmlspecialchars,charset参数的默认值在PHP 5.4中从ISO-8859-1更改为UTF8。

如果您在此处讨论此错误https://bugs.php.net/bug.php?id=61354,您很快就会意识到这会导致维护旧版PHP代码的主要困难。我们遇到了类似的问题。

这篇文章http://nikic.github.io/2012/01/28/htmlspecialchars-improvements-in-PHP-5-4.html中的“大多数人使用UTF-8”这样的解释真的很奇怪。

据我所知,即使设置了ISO-8859-1,htmlspecialchars()也会在UTF8中引用所有内容。使用非ASCII字符集的人必须设置参数... ok,但它们也不受默认行为更改的影响。我编写了很多UTF-8代码,之前使用ISO-8859-1的htmlspecialchars()从未遇到过问题。

那为什么要改变这种行为呢?还是我忽略了一些安全问题?我只想了解它(不需要代码解决方案!)。

1 个答案:

答案 0 :(得分:3)

默认情况下,行为从ISO-8859-1更改为默认值UTF-8,因为UTF-8更常用。

ISO-8859-1涵盖拉丁字符,而UTF-8支持更大的字符集。这就是为什么UTF-8经常用于支持ISO-8859-1。


至于为什么他们选择破坏兼容性:我猜他们认为这是个好主意。也许低估了这种影响。我可以看到这对入门级开发人员来说是一个障碍。

这是对这一突破性变化的潜在解决方法:

function myhtmlspecialchars($string, $flags = null, $encoding = "ISO-8859-1", $double_encode = true) {
    if ($flags === null) { $flags = ENT_COMPAT | ENT_HTML401; }
    return htmlspecialchars($string, $flags, $encoding, $double_encode);
}

然后只需在代码中将htmlspecialchars替换为myhtmlspecialchars


从5.6.0版开始,默认值为default_charset。因此,这仅影响在5.4.x5.5.x

之间的版本上运行的应用程序