gpt4 book ai didi

php - 我的脚本运行良好,但我对为什么必须使用 utf8_decode() 感到困惑

转载 作者:可可西里 更新时间:2023-11-01 06:30:54 26 4
gpt4 key购买 nike

我对 utf8_decode() 的行为感到困惑,只想稍微澄清一下。我希望没关系。

这是一个简单的 HTML 表单,我用它来捕获一些文本并将其保存到我的 MySQL 数据库(使用 utf8_general_ci 归类):

<!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 实体(例如,ñ 变为 ñ)。

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

$string = utf8_decode($string);
$search = explode(",","À,È,Ì,Ò,Ù,à,è,ì,ò,ù,Á,É,Í,Ó,Ú,Ý,á,é,í,ó,ú,ý,Â,Ê,Î,Ô,Û,â,ê,î,ô,û,Ã,Ñ,Õ,ã,ñ,õ,Ä,Ë,Ï,Ö,Ü,Ÿ,ä,ë,ï,ö,ü,ÿ,Å,å,Æ,æ,ß,Þ,þ,ç,Ç,Œ,œ,Ð,ð,Ø,ø,§,Š,š,µ,¢,£,¥,€,¤,ƒ,¡,¿");
$replace = explode(",","&Agrave;,&Egrave;,&Igrave;,&Ograve;,&Ugrave;,&agrave;,&egrave;,&igrave;,&ograve;,&ugrave;,&Aacute;,&Eacute;,&Iacute;,&Oacute;,&Uacute;,&Yacute;,&aacute;,&eacute;,&iacute;,&oacute;,&uacute;,&yacute;,&Acirc;,&Ecirc;,&Icirc;,&Ocirc;,&Ucirc;,&acirc;,&ecirc;,&icirc;,&ocirc;,&ucirc;,&Atilde;,Ntilde;,&Otilde;,&atilde;,&ntilde;,&otilde;,&Auml;,&Euml;,&Iuml;,&Ouml;,&Uuml;,&Yuml;,&auml;,&euml;,&iuml;,&ouml;,&uuml;,&yuml;,&Aring;,&aring;,&AElig;,&aelig;,&szlig;,&THORN;,&thorn;,&ccedil;,&Ccedil;,&OElig;,&oelig;,&ETH;,&eth;,&Oslash;,&oslash;,&sect;,&Scaron;,&scaron;,&micro;&cent;,&pound;,&yen;,&euro;,&curren;,&fnof;,&iexcl;,&iquest;");
$new_input = str_replace($search, $replace, $string);
return utf8_encode($new_input); // right now i just return $new_input.

感谢任何人对此提供的任何见解。

最佳答案

不要使用“accept-charset”。它坏了。大多数浏览器已停止在自己的 http 请求中发送它。一些浏览器 (IE) 在解析表单时完全忽略此属性,而其他浏览器对它的处理非常有限。在实践中,“accept-charset”弊大于利。

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

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

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

所以你应该:

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

关于php - 我的脚本运行良好,但我对为什么必须使用 utf8_decode() 感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9828848/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com