字符集 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() 不起作用的主要内容,如果未能解决你的问题,请参考以下文章