POST提交中的PHP重音字符

时间:2010-12-21 11:33:08

标签: php forms post utf-8 character-encoding

我在submit.php上有一个HTML表单,页面编码为UTF-8(使用元标记),当表单提交到process.php(通过POST)时,一些变量存储在会话,页面使用Header:Location返回submit.php,然后使用会话变量重新显示一些输入的信息。

如果我输入一个重音字符,例如é(& eacute),当页面返回到submit.php时,它不能正确渲染字符,我得到一个ã(& atilde)和©(& ;复制)而不是。

我应该在哪里寻求解决这个问题?我假设它是服务器端,因为呈现的页面总是UTF-8(浏览器在提交之前和之后确认页面是UTF-8)

解决方案:

字符串在某一点通过htmlentities()传递,结果是ISO-8859-1的默认字符编码答案是在函数调用中简单地指定'UTF-8'。

2 个答案:

答案 0 :(得分:6)

é被转换为是一个肯定的标志,在某个点上2字节的UTF-8字符被解释为1字节字符集(很可能是ISO-8859- 1)。

你需要找到发生这种情况的地方,并修复它。

也许展示一些代码 - 也许有人有想法。

答案 1 :(得分:1)

$_SESSION['thestring'] = $_POST['thestring']

无法合理地成为问题来源。这里PHP只是复制两个字节 verbatim 。这里不会出现字符集转换。因此,任何转换都可能发生在之前或之后。

要确保$ _POST不是崇拜者,请检查您的<form>是否包含accept-charset="UTF-8"。这经常被忽视。其次,出于测试目的,在接收时输出$_POST["thestring"]权利。如果问题出现在这里,你需要Firebug和xdebug ..

会话存储或PHP修改$_SESSION中的字符串内容的可能性很小。这就是为什么我会假设错误出现在输出页面中。制作一个单独的测试页,然后print $_SESSION["thestring"]。不要忽视header("Content-Type: text/html; charset=utf-8");