3

我已经开始调试我的 RSS 提要,因为它有一些奇怪的字符(即缺少字符的字形)。我从两个优秀的初学者资源开始:

我认为我们的 RSS 提要有问题的原因是用户将 MS Word 文档复制并粘贴到网站上的文本区域中,而我们的 PHP 页面使用的是与特殊的“Windows-1252”不兼容的“iso-8859-1”字符集MS Word 使用的项目符号和智能引号等内容的编码。

所以我希望解决这个问题,我需要做的就是在接受/提供用户输入的页面中开始使用“utf-8”??即在 HEAD 部分设置以下内容:

<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />

不过,我提出这个问题的真正原因是因为存储用户输入的数据库字段位于“ latin1_swedish_ci”中,我想知道是否需要将它们转换为“ utf8_general_ci”?MySQL 并不真正关心字符集吗?它只看到一堆字节,如果我将 Unicode 放入一个整理为拉丁语的字段中,它仍然会以 Unicode 的形式出现,对吗?更改字段会很烦人,因为该字段是 FULLTEXT 索引的一部分,其中其他字段也需要更改其排序规则,这意味着删除索引并重建它(当涉及大量 TEXT 时,这不是一项小任务)。

4

4 回答 4

6

不过,我提出这个问题的真正原因是因为存储用户输入的数据库字段位于“latin1_swedish_ci”中,我想知道是否需要将它们转换为“utf8_general_ci”?

latin1_swedish_ci,并且utf8_general_ci是排序规则 - 不是字符集。排序规则不会影响字符存储或输入/输出的方式。它只控制排序函数如何对其结果进行排序。排序规则 - 按预期工作 - 应该与存储字符集匹配。因此,如果您的表存储在 utf8 中,则应使用 utf8 排序规则。

mysql 的存储字符集不直接绑定到 php 中的字符集。您可以使用 utf8 作为 Mysql 的存储字符集,而在 php.ini 中使用 iso-8859-1。set names XXX在这种情况下,您需要通过在连接 ( )上设置字符集来告诉 Mysql 。然后 Mysql 将根据需要进行转换。如果你不在 Mysql 和 php 上使用相同的字符集,你最终会得到作为最低 dommon 分母的字符集容量,所以即使字符串存储在 utf8 中,你也不会拥有完整的 unicode 字符范围可用的。因此,您应该在Mysql 和 php中使用 utf8 。

于 2009-05-12T12:42:23.463 回答
1

为了节省一些时间来搜索如何使用 pdo/mysql 很好地更改 mysql 连接字符集,我是这样做的:

$dbc = new pdo('mysql:dbname=DBNAME;host=DBHOST', $user, $pw, array(PDO::MYSQL_ATTR_INIT_COMMAND => sprintf( "SET NAMES %s", $charset ) ) );
于 2009-05-12T20:57:25.813 回答
1

不——绝对不是。由于 MySQL 具有动态将字符串从一个字符集转换为另一个字符集的能力,因此重要的是您的 MySQL 服务器知道您在客户端使用的字符集(客户端 = PHP 脚本,而不是访问您的客户端网页)。这可以通过发出查询来完成

SET NAMES 'utf8';

在您发送到服务器的任何其他查询之前。MySQL 然后会进行适当的转换,从您的客户端字符集到内部 MySQL 字符集到表和/或列字符集,然后一直返回。所以通常你只需要担心设置正确的客户端字符集。此字符集必须与您用于将数据输出到网络服务器的字符集匹配。

请查看 MySQL 手册:

于 2009-05-12T11:36:12.797 回答
0

在 HTTP 中,字符编码由HTTP 响应的标头字段charset中的参数声明。其他声明被 HTTP 标头中的声明覆盖Content-Type

[...] 用户代理在确定文档的字符编码时必须遵守以下优先级(从最高优先级到最低优先级):

  1. " " 字段中的 HTTP " charset" 参数Content-Type
  2. META带有“ ”的声明http-equiv设置为“ Content-Type”,并为“”设置了一个值charset
  3. charset在指定外部资源的元素上设置的属性。

此外,您应该使用元素中的accept-charset属性显式声明接受的字符编码。form否则,用户代理可以(但不能)采用表单文档中使用的字符编码来对输入数据进行编码:

此属性的默认值是保留字符串“UNKNOWN”。用户代理可以将此值解释为用于传输包含此FORM元素的文档的字符编码。

这应该为您提供正确编码传入数据的最佳机会。但它没有保证。所以最好检查数据是否用 UTF-8 进行了精确编码(有函数/算法可以做到这一点)。

于 2009-05-12T11:46:11.303 回答