Web应用程序中的字符编码问题表单提交

时间:2011-01-20 21:42:20

标签: php character-encoding

我有一个网站接受来自不同语言环境的论坛的用户提交,英语和瑞典语是当前“支持”的语言环境。论坛上最常见的语言是瑞典语,这也是我遇到间歇性字符编码问题的地方。

是不是有些浏览器会向我发送ISO 8859编码的字符串,但页面是用utf-8编码的(并且应该以该编码提交?)。我的php服务器端用mb_detect_encoding这样的东西猜测编码,但这似乎没有帮助。

我有这个代码来“猜测”编码

if ( mb_detect_encoding($str, 'UTF-8, ISO-8859-1') == 'ISO-8859-1') {
    return mb_convert_encoding($str, 'UTF-8', 'ISO-8859-1');
}
return $str;  

提交的内容。其他编码选项不是此特定问题的问题。 任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

  

可能有些浏览器发送的是ISO 8859编码的字符串,但页面是用utf-8编码的

如果您正在为包含带有Content-Type: text/html;charset=utf-8标题的表单的网页提供服务,那么这应该不会发生,但有一些警告:

  • 如果用户保存包含表单的页面并从保存的版本中提交,则标题信息将丢失,因此您将获得浏览器猜测的编码,这可能是错误的。在这种情况下,您也可以在页面中添加<meta>版本的标题,以便在保存到光盘时保留信息。

  • 如果用户故意从“视图”菜单更改编码,则通常会导致表单以用户的(错误的)覆盖编码提交。如果你一直为页面提供服务,这是非常罕见的,但<form accept-encoding="utf-8">属性可以缓解一点问题...除了它在IE中无法正常工作。所以这不是万灵药。

  • 如果用户使用某些自定义非浏览器应用提交表单数据,则所有投注均已关闭。

我认为您尝试通过首先尝试使用UTF-8来检测编码,如果您真的无法控制提交编码,则可以做到最好。 mb_detect_encoding有点弱,因为它允许一些不完全有效的字节序列UTF-8('overlongs'),但这个想法是合理的。

答案 1 :(得分:1)

无论HTML页面的字符编码如何,浏览器都可以以任何字符编码方式发送数据。它应该在Content-Type标头中公布使用的编码。您可以使用form上的accept-charset Atrribute来指定要接收的字符编码。