在整个Internet上,包括在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等编辑器中?
这两个选项只是PHP设计师所拥有的最糟糕的想法,而且在编码时他们有很多不好的想法.
将字符串转换到一个特定的编码,人们必须知道什么编码一个转换的.传入数据通常采用未声明的编码; 服务器只接收一些二进制数据,它不知道它代表什么编码.您应该通过accept-charset在表单上设置属性来声明您希望浏览器发送的编码; 这样做并不能保证浏览器会这样做,并且它不会让PHP知道预期的编码.
输出也是如此; PHP字符串只是字节数组,它们没有相关的编码.我不知道PHP如何认为它知道如何在输入或输出时将任意字符串转换为特定的编码.
你应该手动处理这个问题,而且反正真的很容易:向客户端声明你期望的编码,检查输入是否使用正确的编码mb_check_encoding(不是_detect encoding或某些,只检查),拒绝无效输入,注意保留所有内容在整个应用程序流程中的相同编码.即,理想情况下,您的应用中没有任何转换.
如果您确实需要在任何时候进行转换,请将其设置为Unicode三明治:将输入从预期编码转换为UTF-8或输入上的其他Unicode编码,在输出时将其转换回所需的输出编码.无论何时需要转换,请确保您知道要转换的内容.你不能用一个声明神奇地"使所有字符串UTF-8".