我的网站上的字符集存在一些问题。我无法使用 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
。
知道它可能是什么吗?
在任何输出到浏览器之前设置 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 字节)传输数据,那么字符集将在传输中搞砸。
在输出任何 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字符集。我按照以下方式做到了:
$db = new PDO('mysql:host=localhost;dbname=NAME;charset=utf8', 'USERNAME', 'PASSWORD');
一定是主机的服务器更新导致了这个问题,因为我之前没有受到过这个问题的影响。
这与数据库及其设置有关。我从 MYSQL 迁移到 MariaDB,并且必须配置 PDO 驱动程序选项以将名称设置为 UTF8,以便正确显示我的整个网站。感谢Gjert提供线索。
ORM::configure('driver_options', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));