我的脚本工作正常,但我很困惑为什么我必须使用utf8_decode()

use*_*755 9 php mysql diacritics utf8-decode

我对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>
Run Code Online (Sandbox Code Playgroud)

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

当我的脚本收到输入时,我首先必须执行utf8_decode($ input),然后运行我的小脚本来检查并根据需要更改变音符号.一切正常.我很好奇为什么我必须在这个输入上运行解码.据我所知,utf8_decode将以UTF-8编码的字符串转换为ISO-8859-1.我想确保 - 即使一切正常(或者我认为) - 我不会做一些事情,以后会赶上我.例如,我发送的ISO-8859-1编码字符存储在我的数据库中,该数据库设置为存储/提供UTF-8字符.我应该在我的diacritics-to-entities脚本返回的字符串上运行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.
Run Code Online (Sandbox Code Playgroud)

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

小智 0

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

\n