【问题标题】:For what reason htmlspecialchar() default charset changed from ISO-8859-1 to UTF8出于什么原因 htmlspecialchar() 默认字符集从 ISO-8859-1 更改为 UTF8
【发布时间】:2014-04-10 16:44:20
【问题描述】:

根据http://php.net/htmlspecialchars,字符集参数的默认值在 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”之类的解释真的很奇怪。

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

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

【问题讨论】:

  • 不知道真正的原因是什么,但我猜这是为了未来的兼容性,当时 unicode 统治着世界,而 iso8859 之类的东西只是一场遥远的噩梦。
  • 未来的考虑将是一个有效的论点,恕我直言。如果我能决定的话,我会尽快摆脱旧的 ISO-8859-1 代码。
  • PHP 5.4 中的更改只是在您未指定字符集时从 ISO-8859-1 切换到 UTF8。这似乎是一个配置问题,而不是代码更改。
  • 默认 Linux 内核在我使用过的每个系统中都使用 UTF-8。我欢迎这个改变!
  • 这让我想起了 nl2br 在 XHTML 流行期间添加的向后不兼容的更改。

标签: php


【解决方案1】:

行为从默认的 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之间的版本上运行的应用程序

【讨论】:

  • 或者,如果可以的话,您可以更改 php.ini 中的默认字符集。
  • 不适用于 PHP 5.4.x5.5.x
  • 你有没有参考,这种行为在 PHP 5.6 中发生了变化?我在这里找不到任何东西:docs.php.net/manual/en/migration56.php
  • 检查php.net/htmlspecialchars 的文档:从 PHP 5.6.0 开始,default_charset 值被用作默认值。从 PHP 5.4.0 开始,UTF-8 是默认值。 PHP 5.4.0 之前的版本,默认使用 ISO-8859-1。
  • 感谢 PHP 5.6.0 的提示,这让我相信,该语言仍有一些常识。我给它回答的标志。但是,您使用 myhtmlspecialchars 的解决方案并非总是可行的。我猜您没有考虑到商业第三方库,您无法在不失去轻松更新库的能力的情况下更改功能。您必须向他们的开发人员支付更改费用,否则您可能会使用带有 runkit_function_rename 的 runkit 做一些丑陋的事情。
猜你喜欢
  • 2016-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-18
  • 1970-01-01
  • 2010-12-02
相关资源
最近更新 更多