Character encoding 如果输出编码通常通过其他方式固定,那么mb_http_output()有什么用处?

Character encoding 如果输出编码通常通过其他方式固定,那么mb_http_output()有什么用处?,character-encoding,Character Encoding,在整个互联网上,包括stackoverflow中,建议使用mb_http_输入(“utf-8”),让PHP以utf-8编码工作。例如,请参见。另一方面,PHP手册说,我们无法修复PHP脚本中的输入编码,mb_http_输入只是查询它是什么的一种方式,而不是设置它的方式。见和。好的,这只是问题之前的背景说明。在我看来,Apache+PHP+HTML中有很多冗余命令,用于控制从输入编码到内部编码,最后到输出编码的转换。我不明白这有什么用。例如,如果来自某个外部HTTP客户机的原始输入编码是EUC-J

在整个互联网上,包括stackoverflow中,建议使用mb_http_输入(“utf-8”),让PHP以utf-8编码工作。例如,请参见。另一方面,PHP手册说,我们无法修复PHP脚本中的输入编码,mb_http_输入只是查询它是什么的一种方式,而不是设置它的方式。见和。好的,这只是问题之前的背景说明。在我看来,Apache+PHP+HTML中有很多冗余命令,用于控制从输入编码到内部编码,最后到输出编码的转换。我不明白这有什么用。例如,如果来自某个外部HTTP客户机的原始输入编码是EUC-JP,并且我将内部编码设置为UTF-8,那么PHP必须进行转换。我说得对吗?如果我是对的,为什么我要在php.ini中设置输入编码(而不是只传递原始编码),因为它下一步将立即转换为utf-8内部编码?类似的问题也适用于输出。在我所有的htpp文件中,我使用了一个charset=utf-8的元标记。因此,输出HTTP编码是固定的。此外,在PHP.ini中,我可以将HTTP头中出现的默认字符集设置为utf-8。当最终的输出编码已经固定时,我为什么还要费心使用mb_http_输出(“uft-8”)。总而言之,有人能给我一个实际的具体例子吗?在这个例子中,mb_http_输出(“uft-8”)显然是必要的,并且不能被通常默认插入到编辑器(如Dreamweaver)中的更常见的命令所取代

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

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

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

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


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

这个标准呢:?没用吗?@Dominic108肯定有用。它向浏览器声明页面的编码方式。你需要设置这个。这并没有改变我上面写的任何东西。请参阅以了解更多信息。我注意到IE9不会在其发送的头中包含字符集,即使我在表单中指定accept charset=“UTF-8”。我这样说并不是反对你所写的。注意到了。没错,这就是为什么
mbstring.http_input
如此不可靠,因此毫无意义的原因。您可以将
mbstring.http\u output
作为Unicode三明治的助手,但它不允许简单明确地配置要转换的编码,这一事实也使它充其量不可靠。关于
mb\u http\u input()
:任何表示“检测编码”的函数从定义上来说都是无用的。您可以猜测编码,也可以读取元数据编码声明,但无法检测编码。:)通常情况下,关于堆栈溢出上字符编码的答案部分或完全错误,或者答案的作者显然不理解,并且由于盲目的运气,偶然发现了一些看起来正确但实际上不正确的东西。很少有人能可靠地回答问题。