字符集 UTF-8 和 php header() 不起作用

Posted

技术标签:

【中文标题】字符集 UTF-8 和 php header() 不起作用【英文标题】:Charset UTF-8 and php header() not working 【发布时间】:2016-01-03 05:47:05 【问题描述】:

我的网站上的字符集有一些问题。我无法让 UTF-8 字符集工作,我得到的是 � 而不是 Å。是的,我已经在网上搜索了答案,并且已经使用了以下代码:

<!DOCTYPE html>
<head>
    <?php header('Content-type: text/html; charset=utf-8'); ?>
    <meta http-equiv="Content-Type" content="text/html" charset=utf-8" />
    <title><?php echo $db_title; ?></title>
</head>
<body>
    Some content with letters æøå
</body>
</html>

数据库使用latin1_swedish_ci

知道它可能是什么吗?

【问题讨论】:

【参考方案1】:

在任何输出到浏览器之前设置 PHP header 标记(正如 JJ Cantillon 所指出的)

虽然 PHP 和 HTML 使用正确的 UTF-8,但值得注意的是 mysql 使用 UTF-8 的简化版本,因此在选择数据库表/字段的排序规则时,“utf8_general_ci”(和类似) 是不是完整的字符集,因此您要显示的字符将无法正确存储。

您需要做的是通过选择

来确保 MySQL 使用完整的 UTF-8 字符集

排序规则 = 'utf8mb4'

另外,当您将脚本连接到数据库时,您需要为 PHP/MySQL 通信指定相同的 (utf8mb4) 字符集 - 所以设置类似(就 MySQLi 或 PDO 等而言)

new PDO('mysql:host=localhost;charset=utf8mb4')  

或者对于 MySQLi 阅读 http://php.net/manual/en/mysqli.set-charset.php

如果您在 SQL 中将数据存储为utf8mb4,但仅使用标准 MySQL-utf8(3 字节而不是 4 字节)传输数据,则字符集将在传输中搞砸。

阅读:https://***.com/a/16893103/3536236

【讨论】:

很高兴知道,我还没有创建插入系统,但这肯定会让我领先于未来的问题:)【参考方案2】:

经过大量搜索,我发现了以下question. 在数据库连接中,我必须指定我想要 UTF-8 字符集。我是这样做的:

$db = new PDO('mysql:host=localhost;dbname=NAME;charset=utf8', 'USERNAME', 'PASSWORD');

一定是来自主机的服务器更新导致了问题,因为我之前没有受到问题的影响。

【讨论】:

你实际上想要utf8mb4而不是MySQL中的标准utf8。【参考方案3】:

您需要在输出任何 html 之前设置标题。

尝试在您的第一个 HTML 标记之前设置标题。例如:

<?php header('Content-type: text/html; charset=utf-8'); ?>
<!DOCTYPE HTML>
<head>
    <meta http-equiv="Content-Type" content="text/html" charset=utf-8" />
    <title><?php echo $db_title; ?></title>
</head>
<body>
    Some content with letters æøå
</body>
</html>

【讨论】:

我通过更改数据库连接中的字符集解决了这个问题。肯定有主机更新,因为它之前没有影响网站。 嗯,有道理。很高兴听到你解决了。

以上是关于字符集 UTF-8 和 php header() 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

从 header() 获取 PHP 内容类型

如何用php设置utf-8编码

PHP header()函数

PHP网页显示乱码问题总结

php连接数据库

php生成xml数据