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

问题描述 投票:0回答:4

我的网站上的字符集存在一些问题。我无法使用 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 html utf-8 character-encoding
4个回答
2
投票
  • 在任何输出到浏览器之前设置 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://stackoverflow.com/a/16893103/3536236


1
投票

在输出任何 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>

1
投票

经过大量搜索后,我遇到了以下问题。在数据库连接中,我必须指定我想要UTF-8字符集。我按照以下方式做到了:

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

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


0
投票

这与数据库及其设置有关。我从 MYSQL 迁移到 MariaDB,并且必须配置 PDO 驱动程序选项以将名称设置为 UTF8,以便正确显示我的整个网站。感谢Gjert提供线索。

ORM::configure('driver_options', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
© www.soinside.com 2019 - 2024. All rights reserved.