5

在整个互联网上,包括在 stackoverflow 中,建议使用 mb_http_input('utf-8') 让 PHP 以 UTF-8 编码工作。例如,请参阅PHP/MySQL 编码问题。â��而不是某些字符。另一方面,PHP 手册说我们无法修复 PHP 脚本中的输入编码,并且 mb_http_input 只是一种查询它是什么的方法,而不是一种设置它的方法。见http://www.php.net/manual/en/mbstring.http.phphttp://php.net/manual/en/function.mb-httpetinput.php. 好的,这只是对问题之前的上下文的澄清。在我看来,Apache + PHP + HTML中有很多多余的命令来控制从输入编码到内部编码,最后到输出编码的转换。我不明白这个的用处。例如,如果来自某个外部 HTTP 客户端的原始输入编码是 EUC-JP,而我将内部编码设置为 UTF-8,那么 PHP 将不得不进行转换。我对吗?如果我是对的,为什么我要在 php.ini 中设置输入编码(而不是只传递原始编码),因为它接下来会立即转换为 utf-8 内部编码?类似的问题也适用于输出。在我所有的 htpp 文件中,我使用带有 charset=utf-8 的元标记。因此,输出 HTTP 编码是固定的。此外,在 PHP.ini 中,我可以将出现在 HTTP 标头中的 default_charset 设置为 utf-8。当最终输出编码已经固定时,我为什么还要费心使用 mb_http_output('uft-8') 。总而言之,有人可以给我一个实际的具体示例,其中 mb_http_output('uft-8') 显然是必要的,并且不能被通常在 Dreamweaver 等编辑器中默认插入的更常用命令替换?

4

1 回答 1

10

这两个选项几乎是 PHP 设计人员曾经有过的最糟糕的想法,而且他们在编码方面有很多糟糕的想法。

要将字符串转换特定的编码,必须知道什么编码转换。传入的数据通常采用未声明的编码;服务器只是接收一些二进制数据,它不知道它代表什么编码。accept-charset您应该通过在表单上设置属性来声明您希望浏览器发送的编码;这样做并不能保证浏览器会这样做,并且它不会让 PHP 知道期望什么编码。

输出也是如此;PHP 字符串只是字节数组,它们没有关联的编码。我不知道 PHP 如何认为它知道如何在输入输出时将任意字符串转换为特定的编码。

您应该手动处理这个问题,而且无论如何都很容易做到:向客户声明您期望的编码,检查输入是否使用正确的编码mb_check_encoding(不是_detect encoding或类似的,只需检查),拒绝无效输入,注意保留所有内容在整个应用程序流程中使用相同的编码。即,理想情况下,您的应用程序中没有任何转换。

如果您确实需要在任何时候进行转换,请将其设置为 Unicode 三明治:将输入从预期的编码转换为 UTF-8 或输入时的其他 Unicode 编码,在输出时将其转换回所需的输出编码。每当您需要转换时,请确保您知道要转换内容。您不能通过一个声明神奇地“将所有字符串设为 UTF-8”。

于 2013-04-06T00:48:41.393 回答