我正在努力寻找解决方案来继续使用Suhosin补丁,并使其能够使用UTF-8表单提交。这是非常简单的测试我做:使用字符串iñtërnâtiônàlizætiønPHP 5.3,Suhosin和UTF-8
<?php var_dump($_POST); ?>
<form method="post">
<input name="test" type="text"/>
<input type="submit" />
</form>
。 显然,我首先在服务器上启用utf-8头文件,并将Php default_charset设置为utf-8,并且启用了mb *重写。 只要我禁用Suhosin补丁并重新提交表单,一切都按原样运行。
UPDATE
我做更多的测试,只是可以肯定的:
$test = $_POST['test'];
var_dump(mb_detect_encoding($test, "UTF-8", true));
// Returns true if $string is valid UTF-8 and false otherwise.
function is_utf8($string) {
// From http://w3.org/International/questions/qa-forms-utf-8.html
return preg_match('%^(?:
[\x09\x0A\x0D\x20-\x7E] # ASCII
| [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
| \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
| \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
| \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
| [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
| \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
)*$%xs', $string);
} // function is_utf8
var_dump(is_utf8($test));
两者的测试返回false启用和真否则了Suhosin补丁。问题是:它是一个错误还是预期的行为?是否有Suhosin补丁的配置参数对多字节字符串做了一些神奇的事情?
我在这里看到的唯一选择是禁用该补丁,除非一位聪明的头脑给出正确的建议。
更新2
的GET字符串不破坏,并正确显示在浏览器中。目前只有POST进行。
你应该得到某种形式的错误。同时检查你的错误日志。我也强烈建议不要使用mb_函数覆盖。他们将搞砸了很多现有的代码。最好在你需要时总是明确地使用mb_函数。 – Evert
我看不到任何错误:字符串只是错误地解码 – zekus
它是如何解码不正确?你甚至没有提到你的问题。添加实际问题的详细信息,而不是'它无效' – Evert