PHP 5.3、Suhosin和UTF-8

PHP 5.3、Suhosin和UTF-8,php,utf-8,suhosin,Php,Utf 8,Suhosin,我正在努力找到一个解决方案,继续使用Suhosin补丁,并使其与UTF-8表单提交一起工作。这是我做的一个非常简单的测试: <?php var_dump($_POST); ?> <form method="post"> <input name="test" type="text"/> <input type="submit" /> </form> 在启用Suhosin补丁的情况下,这两个测试都返回false,否则返回t

我正在努力找到一个解决方案,继续使用Suhosin补丁,并使其与UTF-8表单提交一起工作。这是我做的一个非常简单的测试:

<?php var_dump($_POST); ?>
<form method="post">
    <input name="test" type="text"/>
    <input type="submit" />
</form>
在启用Suhosin补丁的情况下,这两个测试都返回false,否则返回true。问题是:这是一个bug还是预期的行为?Suhosin补丁是否有一个配置参数,它对多字节字符串起到了神奇的作用

我现在看到的唯一选择是禁用补丁,除非聪明的头脑给出正确的建议

更新2

GET字符串不会损坏,并且会正确显示在浏览器中。目前只有POST可以做。你试过了吗

<form accept-charset="UTF-8" method="post">


->

您是否在下面的HTML页面上尝试了元标记

<meta http-equiv="Content-Type" content="text/html;charset=utf-8" ></meta>

在谷歌搜索中,我找到了

从PHP 4.3.3开始,如果HTML表单的enctype设置为multipart/form data,并且
mbstring.encoding\u translation
PHP.ini
中设置为On,则POST的变量和上传文件的名称也将转换为内部字符编码。但是,转换不会应用于查询键

这对我来说并不意味着什么,但它确实提到了POST变量,这似乎是问题的症结所在

我发现,如果我在Apache虚拟主机中设置此选项,我可以重现您的问题:

php_admin_value mbstring.language       "Neutral"
php_admin_value mbstring.encoding_translation   "On"
php_admin_value mbstring.http_input     "UTF-8"
php_admin_value mbstring.http_output    "UTF-8"
php_admin_value mbstring.detect_order   "auto"
php_admin_value mbstring.substitute_character   "none"
php_admin_value mbstring.internal_encoding "UTF-8"
php_admin_value mbstring.func_overload "7"
php_admin_value default_charset "UTF-8"
作为参考,这是我用来重现问题的php测试页面:

<!DOCTYPE html>
<html>
<head>
</head>
<body>
<pre><?php echo $_POST['test'];?></pre>
<form method="post">
    <input name="test" type="text"/>
    <input type="submit" />
</form>
Test string to use: iñtërnâtiônàlizætiøn
</body>
</html>
这似乎解决了这个问题,尽管它对我来说没有多大意义,因为内部字符编码是utf-8


我注意到的另一个奇怪之处是,如果我直接在
php.ini
(而不是Apache虚拟主机)中设置这些
mbstring
值,我就无法用
encoding\u translation
重现问题,因此只有在使用
php\u admin\u value
时才出现问题?

您应该会得到某种形式的错误。还要检查您的错误日志。我还强烈建议不要使用mb_u函数覆盖。他们会破坏很多现有的代码。在需要mb_uu函数时,最好总是显式地使用它们。我看不出任何错误:字符串只是被错误地解码了。它是如何被错误地解码的?你的问题中甚至没有提到这一点。添加实际问题的详细信息,而不是“它不起作用”嘿,埃弗特,非常感谢你的帮助,没有必要太苛刻。我指定的示例代码非常简单:如果我禁用suhosin修补程序,我会在浏览器中正确显示字符串,否则我会看到问号:I�T�注册护士�钛�N�利兹�钛�n@zekus只是想用print\r()代替var\u dump();谢谢MasterCassim,但这也不起作用……仍然可以看到错误解码的字符串。嗨,Roshan,服务器头总是覆盖html元,因此不需要指定它。无论如何,我也用它进行了测试,问题仍然存在。此解决方案部分解决了问题:我仍在调查以下情况:e字符串仍然被mbstring与suhosin组合损坏。
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<pre><?php echo $_POST['test'];?></pre>
<form method="post">
    <input name="test" type="text"/>
    <input type="submit" />
</form>
Test string to use: iñtërnâtiônàlizætiøn
</body>
</html>
; Disable HTTP Input conversion (PHP 4.3.0 or higher)
mbstring.encoding_translation = Off