我有一个 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);
}

MS Word 将引号更改为“智能引号”,这根本不是智能的。他们使用 Microsoft“代码页”而不是 Unicode。

您也会注意到一些连字符。

如果正确指定所有编码,这些编码应自动转换为其等效的 Unicode。我怀疑这个问题是 Word 特有的;尝试直接输入 Alt+130 (é),看看它是否清晰。

有一些奇怪的事情 - 它看起来像是被破坏了两次 - 首先,一个正确的单引号作为 utf8 发送到一个需要 cp1252 的进程;其次,它通过一个非常简单的转换再次转换为 utf8,该转换仅对字节起作用,而不是查找 Unicode 数据库。如果您使用 PHP/Mysql,则第一个转换可能是由于 utf8 保存在数据库中而没有首先运行“设置名称 utf8”,而第二个转换是 utf8_encode 所做的。

+1,这些问题没有一种本地解决方案,重要的是无论您在传输或存储文本时都具有编码意识的心态。

我自己也这样做过,但我认为这是一个坏主意。如果您有一个文本进程或任何其他类型的进程会损坏您的数据,请修复该进程,使其不会损坏数据,而不要只是对输出进行零碎的更正。