3

我正在努力寻找一种解决方案来继续使用 Suhosin 补丁并使其适用于 UTF-8 表单提交。这是我做的非常简单的测试:

<?php var_dump($_POST); ?>
<form method="post">
    <input name="test" type="text"/>
    <input type="submit" />
</form>

使用字符串iñtërnâtiônàlizætiøn。显然,我首先在服务器上启用了 utf-8 标头,并将 Php default_charset 设置为 utf-8,并启用了 mb* 覆盖。一旦我禁用 Suhosin 补丁并重新提交表单,一切都会正常运行。

更新

为了确定,我做了更多的测试:

$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));

在启用 Suhosin 补丁的情况下,这两个测试都返回 false,否则返回 true。问题是:这是一个错误还是预期的行为?Suhosin 补丁是否有一个配置参数,它对多字节字符串有什么魔力?

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

更新 2

GET 字符串不会被损坏,并且会正确显示在浏览器中。目前只做 POST 。

4

3 回答 3

0

你试过吗?

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

-> http://www.razorvine.net/test/utf8form/utf8pageform.html

于 2011-10-10T10:37:26.967 回答
0

您是否在 HTML 页面上的元标记中尝试过以下

<meta http-equiv="Content-Type" content="text/html;charset=utf-8" ></meta>
于 2011-10-10T10:58:38.007 回答
0

从谷歌搜索,我发现http://algorytmy.pl/doc/php/ref.mbstring.php其中提到

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

这对我来说意义不大,但它确实提到了 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>

我尝试注释掉以下 mbstring 设置(或将其关闭):

; Disable HTTP Input conversion (PHP 4.3.0 or higher)
mbstring.encoding_translation = Off

这似乎解决了这个问题,尽管它对我来说没有多大意义,因为内部字符编码utf-8??

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

于 2011-10-10T17:27:24.670 回答