如何与数据库,文本区域等一起正确处理字符集

时间:2012-04-16 21:01:49

标签: php mysql html

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

所以我在我的HTML中声明了一个meta-charset:

<meta charset="utf-8">

将内容存储在我的数据库中,它还需要正确的设置,因此我将整理设置为utf8_general_ci

unicode

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

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

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

这些是phpMyAdmin启动界面中的charset设置: phpMyadmin

作为Daan问题的答案:

字符%:

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/

校对%

phpMyadmin

collation_connection = utf8_general_ci
collation_database = utf8_general_ci
collation_server = latin1_swedish_ci

我该如何解决这个问题?

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

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

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

添加:<meta http-equiv="content-type" content="text/html; charset=utf-8" />

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

解决方案

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

3 个答案:

答案 0 :(得分: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, 
                    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

答案 1 :(得分:0)

我的猜测是它可能是浏览器方面的事情。还有几件事需要检查:

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

答案 2 :(得分:0)

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