【问题标题】:How to handle character sets properly in conjunction with a database, text areas etc etc如何结合数据库、文本区域等正确处理字符集
【发布时间】:2012-04-16 21:01:49
【问题描述】:

一劳永逸地,我想清楚如何在我的应用程序中处理 ü 等。 我知道使用 UTF-8 是存储/表示这些奇怪字符的最佳方式。

所以我在我的 HTML 中声明了一个元字符集:

<meta charset="utf-8">

将内容存储在我的数据库中,它还需要正确的设置,所以我将排序规则设置为utf8_general_ci

据我了解,没有其他地方可以定义字符集。但是有什么问题呢?

如果我进入 phpMyAdmin 并在内容字段中添加 jülich,然后通过 mysql 查询和 PHP 从数据库中减去内容。 ü 正确显示。 但是,如果我在 Textarea 中查看它,它会显示一个黑色菱形图形和一个白色 ?在里面。

如果我在我的应用程序的文本区域中输入文本并提交,它会在文本区域中显示正确。但在网站上显示 ü

这些是 phpMyAdmin 启动屏幕中的字符集设置:

作为对大安问题的回答:

字符%:

character_set_client = utf8
character_set_connection = utf8
character_set_database = utf8
character_set_filesystem = binary
character_set_results = utf8
character_set_server = latin1
character_set_system = utf8
character_sets_dir = /usr/share/mysql/charsets/

整理%

collation_connection = utf8_general_ci
collation_database = utf8_general_ci
collation_server = latin1_swedish_ci

我该如何解决这个问题?

到目前为止我所做的事情:

已添加:header('Content-type: text/html; charset=utf-8');

已添加:$this-&gt;db-&gt;setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8'");

添加:&lt;meta http-equiv="content-type" content="text/html; charset=utf-8" /&gt;

添加:$this->db = new PDO($dsn, $username, $password, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

解决方案

以上所有内容都像魅力一样工作。但是如果你使用一个函数来替换某些特殊的例程并通过utf8_decode()返回被替换的字符串,它显然不会显示ü;(

【问题讨论】:

  • 您能否向我们展示来自 phpMyAdmin 和您自己的 PHP 代码的 SHOW VARIABLES LIKE '%character'SHOW VARIABLES LIKE 'collation%'queries 的输出?
  • 对不起,应该是SHOW VARIABLES LIKE 'character%',当然
  • @Daan 我已将结果添加到我原来的问题中。看来collation_connection 是不同的。我应该改变它吗?我该怎么做?
  • 所有这些看起来都很好......有没有我们可以现场看到的地方?
  • 我发现了问题!一个替换函数返回了一个 str ,它通过utf8_decode() .... grrrrrrrrr

标签: php mysql html


【解决方案1】:

您真的应该阅读MySQL specific PDO documentation,因为它明确指出,PDO::MYSQL_ATTR_INIT_COMMAND 常量只能在构造新数据库句柄时在 driver_options 数组中使用。

因此,您应该在创建 PDO 句柄时指定 MYSQL_ATTR_INIT_COMMAND 而不是使用 setAttribute,如下所示:

$this->db = new PDO($dsn, $username, $password, 数组(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

【讨论】:

  • 将其添加到对象的创建中没有任何区别。
【解决方案2】:

我猜这可能是浏览器方面的问题。还有几件事要检查:

  1. 您的 Web 服务器为 Content-Type 标头发送什么?它使用charset=utf-8吗?
  2. 您是否在 HTML 页面的 DOCTYPE 中指定了不同的字符集?

【讨论】:

  • 服务器发送这个:Content-Type:text/html 这是文档类型:&lt;!DOCTYPE html&gt;
  • @stUrb - 我能想到的另一件事是检查来自 PHP 的 MySQL 连接的客户端字符集。您可以在建立数据库连接后调用mysql_set_charset('utf8') 进行测试。
  • 我正在使用 PDO,所以添加 `$this->db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8'");'好像没用。
【解决方案3】:

确保 phpMyAdmin 本身 已正确配置为使用 UTF8。好像不是。

【讨论】:

    猜你喜欢
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    • 2016-08-23
    • 1970-01-01
    相关资源
    最近更新 更多