charset如何运作?

时间:2013-10-22 14:48:51

标签: php web character-encoding

我以为我理解charset是如何工作的,但显然还没有。

使用eclipse我创建一个新的PHP项目。我添加了一个index.php文件(非常简单):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
  <head>
<meta http-equiv="Content-Type" content="text/html charset=utf-8" />
  </head>
  <body>
    <?php
      try {
    $dbh = new PDO('mysql:host=localhost;dbname=symfony', 'root', '');
    foreach($dbh->query('SELECT * from product') as $row) {
    print_r($row['description'] ."</br/>");
    }
    $dbh = null;
      } catch (PDOException $e) {
    print "Erreur !: " . $e->getMessage() . "<br/>";
    die();
      }
   ?>
  </body>
</html>

字段'description'是utf8_general

我的数据库是utf8_general

我可以在phpMyAdmin中读到我的数据库服务器charser UTF-8 Unicode(utf8)

我在Apache配置文件中添加了指令'AddDefaultCharset utf-8'

php文件中的charset是utf-8

无论如何,强调的字母都有问题。

要正确显示它们,我可以:

  • 更改Apache默认字符集:AddDefaultCharset iso-8851-1

OR

  • 使用utf8_encode PHP函数

我的问题是:考虑到所有内容都是UTF-8,我的字符串何时在执行行中以iso-8851-1格式化?

2 个答案:

答案 0 :(得分:3)

关于UTF-8,Stack Overflow用户在UTF-8 all the way through编译了一个非常全面的检查列表。在您的情况下,缺少的是您没有告诉PDO 连接编码:

$dbh = new PDO('mysql:host=localhost;dbname=symfony', 'root', '');

......应该是:

$dbh = new PDO('mysql:host=localhost;dbname=symfony;charset=utf8', 'root', '');

请注意,当{{1}时,对于PHP 5.3.6或更高版本,不鼓励设置此类编码的所有其他替代方法(即手动或使用SET NAMES utf8参数运行PDO::MYSQL_ATTR_INIT_COMMAND) }参数已添加到DSN。

答案 1 :(得分:0)

您还必须将连接设置为UTF-8

$dbh->query('SET NAMES utf8 COLLATE utf8_general')