我有一个 HTML 表单,一些用户正在从 MS Word 复制/粘贴文本。当有单引号或双引号时,它们会被翻译成有趣的字符,例如:
'€™ 和 ’
数据库列的排序规则为 utf8_general_ci。
如何让合适的角色出现?
编辑: 问题已解决。这是我修复它的方法:
mysql_query("SET NAMES 'utf8'");
在从数据库添加/检索之前运行。(感谢下面多纳尔的评论)。
有点奇怪的是,显示时应用了 php 函数urlencode($text)
,因此必须将其删除。
我还确保页面的标头和 ajax 请求/响应都是 utf8。
这看起来像是 unicode(最有可能是 UTF-8)字符被解释为 iso-8859-1 的经典案例。一路上有几个地方角色可能会被破坏。首先,客户端的浏览器必须发送数据。如果无法将字符正确转换为页面的字符编码,则可能会损坏数据。然后服务器读取数据并将字节解码为字符。如果客户端和服务器对所使用的编码不一致,则字符将被损坏。然后将数据存入数据库;再次存在腐败的可能性。最后,当数据写入页面(用于显示给浏览器)时,如果页面没有充分指示其编码,则浏览器可能会误解字节。
您需要确保自始至终都使用 UTF-8。网页的默认值为 iso-8859-1,因此您的网页应使用 Content-Type 标头或元标记
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
(确保您确实以该编码提供文本)。
通过在整个过程的所有部分使用 UTF-8,您将避免所有工作 Web 浏览器和数据库出现问题。
检查页面使用的编码。也使用 UTF-8 对其进行编码,并添加描述编码的元标记:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
我们有一个 PHP 函数,它尝试用智能引号来清理混乱。这有点混乱,因为它是随着原型开发过程中出现的案例而有机增长的。不过,这可能会有所帮助:
function convert_smart_quotes($string) {
$search = array(chr(0xe2) . chr(0x80) . chr(0x98),
chr(0xe2) . chr(0x80) . chr(0x99),
chr(0xe2) . chr(0x80) . chr(0x9c),
chr(0xe2) . chr(0x80) . chr(0x9d),
chr(0xe2) . chr(0x80) . chr(0x93),
chr(0xe2) . chr(0x80) . chr(0x94),
chr(226) . chr(128) . chr(153),
'’','“','â€<9d>','â€"',' ');
$replace = array("'","'",'"','"',' - ',' - ',"'","'",'"','"',' - ',' ');
return str_replace($search, $replace, $string);
}