PHP: 不可读的输出字符

PHP: unreadable output characters

我正在使用 PHP 处理一个页面,但是当我检索它时存储在我的数据库中的数据(文本)显示不可读的字符,正如您从我的在线实例中看到的那样。

http://www.taleemulislam-radio.com/test.php

我的那个页面的 PHP 代码是:

<?php
require_once "pdo.php";

try {
    $sql = "SELECT * FROM `content` ORDER BY `updated` DESC LIMIT 1";
    $result = $pdo->query($sql);
    $result = $result->fetchAll(PDO::FETCH_ASSOC);
} catch(PDOException $e) {
    die("Error: ".$e->getMessage());
}

header("Content-Type: text/html; charset=utf-8");
?>
<!DOCTYPE html>
<html lang="ps">
<head>
    <meta charset="utf-8">
    <title>تعليم الاسلام راډيو</title>
</head>
<body>
    <?=var_dump($result)?>
</body>
</html>

示例: http://www.taleemulislam-radio.com/test.php

元标记应该是

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

设置 PDO dsn 的字符集属性。

将您的列声明为 CHARACTER SET utf8。提供 SHOW CREATE TABLE content; 进行验证。

让我们检查一下存储的内容。请做SELECT col, HEX(col) ...;看看你是不是得到了大部分D8xx和D9xx,比如:

D8AAD8B9D984D98AD98520D8A7D984

如果你的"unreadable characters"是

تعليم الاسلام راډيو

那么经典案例就是

  • 您在客户端中的字节已正确编码为 utf8.apostrophe。)
  • 您连接的是 SET NAMES latin1(或 set_charset('latin1') 或...),可能是默认连接。 (应该是utf8。)
  • table 中的列已声明 CHARACTER SET latin1。 (或者可能是继承自 table/database。)(应该是 utf8。)

数据 的修复是“两步更改”。

ALTER TABLE Tbl MODIFY COLUMN col VARBINARY(...) ...;
ALTER TABLE Tbl MODIFY COLUMN col VARCHAR(...) ... CHARACTER SET utf8 ...;

其中的长度足够大,而其他“...”的其他内容(NOT NULL,等等)已经在列中了。