2012-03-22 59 views
9

我对utf8_decode()的行为感到困惑,只是想澄清一下。我希望没关系。我的脚本工作正常,但我很困惑,为什么我必须使用utf8_decode()

下面是我使用捕捉一些文本,并将其保存到我的MySQL数据库(它使用utf8_general_ci整理)一个简单的HTML表单:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
</head> 
<body> 
<form action="update.php" method="post" accept-charset="utf-8"> 
<p> 
    Title: <input type="text" name="title" id="title" accept-charset="utf-8" size="75" value="" /> 
</p> 
<p> 
    <input type="submit" name="submit" value="Submit" /> 
</p> 
</form> 
</body> 
</html> 

正如你可以看到我有这个编码在恰当的地方使用charset = utf8。我们接受包含变音符号的文本(例如,ñ,ó等)。最后,我们在所有文本输入上运行一个小脚本来检查变音符号并将它们更改为HTML实体(例如,变为& ntilde;)。

当我的脚本接收到输入时,首先必须执行utf8_decode($ input),然后运行我的小脚本以检查并根据需要更改变音符号。一切正常。我很好奇为什么我必须在这个输入上运行解码。据我所知,utf8_decode将以UTF-8编码的字符串转换为ISO-8859-1。我想确保 - 即使一切正常(或者我认为),- - 我没有做一些棘手的事情,以后会赶上我。例如,我发送ISO-8859-1编码字符以存储在设置为存储/提供UTF-8字符的数据库中。我应该在字符串上运行utf8_encode(),以便我的符号转换为实体脚本返回?例如:

​​

欣赏任何人都必须提供的见解。

+5

+1不让“它的作品”足够好 – bernie 2012-03-22 19:09:01

回答

0

当使用accept-charset =“utf-8”提交表单时,浏览器将表单数据发送到使用utf-8编码的ISO-8859-1字符的服务器。 utf8_decode将编码数据bact转换为严格的ISO-8859-1。例如,如果您提交“ñ”,则utf-8编码将向您的表单操作提交“%F1”,而您的表单操作必须转换回“ - ”才能使脚本正常工作。

0

因此会显示要在utf-8中显示的文本,但即使您使用accept-charset =“utf-8”将其切换到utf8,服务器也会将它演唱到iso-8859-1,然后当它显示出来然后再从iso-8859-1转换为utf-8,但是能够转换utf-8唯一的字符,所以它最终显示了一个奇怪的字符,并且每次循环这个过程时它都会得到更糟糕的是,所以我发现即使你在html端做了所有事情,也没有办法在服务器上切换它来读取utf-8,所以你不能将所有的东西切换到utf- 8。这是在Apache上,如果有我想知道的方式。

1

请勿使用“accept-charset”。它坏了。大多数浏览器都停止在自己的http请求中发送它。有些浏览器(IE)在解析表单时完全忽略了这个属性,而其他浏览器的工作量非常有限。在实践中,“接受 - 字符集”会造成更多的伤害而不是好的。

约定是浏览器将以与收到表单相同的编码发送数据。因此,请确保您的页面以UTF-8格式发送。你的元标记在HTML的头部是不够的。对于PHP页面,此设置可以设置为3个位置:

  • HTML标记<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />在“头部”。
  • 在Apache配置中的AddDefautCharset UTF8行(或其他Web服务器中的任何类似行)。
  • header("Content-type=text/html; charset=utf-8");的PHP调用(在页面上显示任何内容之前)。

每个指令都会覆盖以前的指令。所以如果你的服务器已经声明了一个字符集,你的元标记将被忽略。

所以你应该:

  • 确保你的源文件是UTF-8,当然。
  • 修复您的HTML源代码,使其在W3C验证。例如,你的meta标签应该在XHTML中关闭。
  • 删除“accept-charset”属性。
  • 最终,强制编码声明在Apache或PHP的header()
  • 确保在浏览器中从服务器接收到的HTTP标题具有正确的编码声明(或者如果您依赖元标记,则无编码)。在Linux上,curl -I <URL>仅显示HTTP标头。
相关问题