字符在UTF-8网站上无法正确显示

Chu*_*utt 5 php mysql html5 utf-8 html-entities

我已经做了所有可以想到的事情,但是特殊字符无法在此网页上正确显示。

例如,在数据库中:

在此处输入图片说明

但是在网站上是:

Nouveaux R?alistes
Run Code Online (Sandbox Code Playgroud)

这是我检查过的所有内容...

数据库设置为UTF-8:

在此处输入图片说明

该页面是用NetBeans编写的,文档编码设置为UTF-8:

在此处输入图片说明

页面标题声明了UTF-8:

在此处输入图片说明

元字符集设置为UTF-8:

在此处输入图片说明

我什至在.htacess中添加了以下行:

在此处输入图片说明

但是那里的字符仍然不能正确显示,并且我从W3C验证程序收到以下错误:

在此处输入图片说明

我觉得我已经尝试了一切,但仍然无法正常工作。(我什htmlspecialcharshtmlentities在PHP中都尝试过,但是页面甚至无法呈现!)


更新
根据要求,这是我正在使用的代码:

class Exhibition {
    public $exhibitionDetails;    

    public function __construct(Database $db, $exhibitionID){
        $this->_db = $db;

        $params['ExhibitionID'] = $exhibitionID;

        $STH = $this->_db->prepare("SELECT * 
            FROM Exhibition
            INNER JOIN Schedule
                ON Exhibition.ExhibitionID = Schedule.ExhibitionID            
            WHERE Schedule.Visible = 1
                AND Exhibition.ExhibitionID = :ExhibitionID;");

        $STH->execute($params);

        $this->exhibitionDetails = $STH->fetchAll(PDO::FETCH_ASSOC);

    }
}
Run Code Online (Sandbox Code Playgroud)

和...

try {
    $db = new Database(SITE_ROOT."/../");
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $exhibition = new Exhibition($db,$_GET['id']);
} catch (PDOException $e) {
    echo "<p class='error'>ERROR: ".$e->getMessage()."</p>";
}
Run Code Online (Sandbox Code Playgroud)

最后...

<p><?php echo $exhibition->exhibitionDetails[0]["Desc"]; ?></p>
Run Code Online (Sandbox Code Playgroud)

Wes*_*óes 4

如果您使用的是mysql_*函数:

mysql_query("SET NAMES 'utf8'");
Run Code Online (Sandbox Code Playgroud)

如果您正在使用PDO

$dsn = 'mysql:host=localhost;dbname=testdb';
$username = 'username';
$password = 'password';
$options = array(
    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
); 

$dbh = new PDO($dsn, $username, $password, $options);
Run Code Online (Sandbox Code Playgroud)

它设置连接编码。

  • 至少[使用 *mysql* API,您不应该使用 `SET NAMES` 而应使用 `mysql_set_charset`](http://stackoverflow.com/a/5289141/53114)。 (2认同)
  • 它可能会导致问题,“mysql_*”函数不会对直接的 SET NAMES 做出反应,这就是为什么您必须通过“mysql_set_charset”。没有理由不使用它,因为它更容易编写和阅读。 (2认同)