在整个互联网上,包括在 stackoverflow 中,建议使用 mb_http_input('utf-8') 让 PHP 以 UTF-8 编码工作。例如,请参阅PHP/MySQL 编码问题。â��而不是某些字符。另一方面,PHP 手册说我们无法修复 PHP 脚本中的输入编码,并且 mb_http_input 只是一种查询它是什么的方法,而不是一种设置它的方法。见http://www.php.net/manual/en/mbstring.http.php和http://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 等编辑器中默认插入的更常用命令替换?
1 回答
这两个选项几乎是 PHP 设计人员曾经有过的最糟糕的想法,而且他们在编码方面有很多糟糕的想法。
要将字符串转换为特定的编码,必须知道从什么编码转换。传入的数据通常采用未声明的编码;服务器只是接收一些二进制数据,它不知道它代表什么编码。accept-charset
您应该通过在表单上设置属性来声明您希望浏览器发送的编码;这样做并不能保证浏览器会这样做,并且它不会让 PHP 知道期望什么编码。
输出也是如此;PHP 字符串只是字节数组,它们没有关联的编码。我不知道 PHP 如何认为它知道如何在输入或输出时将任意字符串转换为特定的编码。
您应该手动处理这个问题,而且无论如何都很容易做到:向客户声明您期望的编码,检查输入是否使用正确的编码mb_check_encoding
(不是_detect encoding
或类似的,只需检查),拒绝无效输入,注意保留所有内容在整个应用程序流程中使用相同的编码。即,理想情况下,您的应用程序中没有任何转换。
如果您确实需要在任何时候进行转换,请将其设置为 Unicode 三明治:将输入从预期的编码转换为 UTF-8 或输入时的其他 Unicode 编码,在输出时将其转换回所需的输出编码。每当您需要转换时,请确保您知道要转换的内容。您不能通过一个声明神奇地“将所有字符串设为 UTF-8”。