为啥我的 html 不显示从我的数据库中获取的特殊字符

Posted

技术标签:

【中文标题】为啥我的 html 不显示从我的数据库中获取的特殊字符【英文标题】:why does my html not display special characters taken from my database为什么我的 html 不显示从我的数据库中获取的特殊字符 【发布时间】:2016-03-01 03:43:28 【问题描述】:

我将它包含在我的 php 文件的顶部:

<?php
    header('Content-Type: text/html; charset=UTF-8');
?>

我这样做是因为我的 file.php 在 html 文件或从我的数据库中查询的数据中没有显示“á、é、í、ó、ú 或 ¿”。

在我放置 'header('Content-Type: text/html; charset=UTF-8');' 之后我的 html 页面开始理解 html 文件中的特殊字符,但是从我的数据库接收到的数据现在有一个带问号的黑色菱形。

我的数据库的排序规则是“utf8_spanish_ci”

在 html 标记处,我尝试将 lang=es 放入,但这从未奏效,我还尝试将元标记放入 head 标记中

<!DOCTYPE html>
<html lang=es>
<head>
     <meta http-equiv="content-type" content="text/html; charset=UTF-8">
<head>

我也试过了:

<meta charset="utf-8">

和:

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

我不知道问题是什么。当我将数据直接插入数据库时​​,特殊字符就在那里,但是当我从我的 file.php 插入它们时,它们会出现随机字符。

有人知道为什么会这样吗?

【问题讨论】:

字符在你的数据库中显示是否正确;可能一开始就写错了。 它们已正确插入数据库中,当我阅读它们时,它们看起来就像我放置它们一样 【参考方案1】:

发生这种情况的原因有几个。然而,重要的是您的整行代码都使用相同的字符集,并且所有可以设置为特定字符集的函数都设置为相同的。使用最广泛的一种是 UTF-8,这是我建议您使用的一种。

连接

您还需要在连接本身中指定字符集。 PDO(在对象本身中指定):$handler = new PDO('mysql:host=localhost;dbname=database;charset=utf8', 'username', 'password', array(PDO::MYSQL_ATTR_INIT_COMMAND =&gt; "SET CHARACTER SET UTF8")); MySQLi:(创建连接后直接放置) * 对于 OOP:$mysqli-&gt;set_charset("utf8"); * 对于程序:mysqli_set_charset($mysqli, "utf8"); (其中$mysqli 是 MySQLi 连接) MySQL已弃用,应转换为 PDO 或 MySQLi):(在创建连接后直接放置)mysql_set_charset("utf8");

数据库

您的数据库 及其所有表都必须设置为 UTF-8。请注意,字符集与排序规则相同。

您可以通过对每个数据库和表(例如在 phpMyAdmin 中)运行下面的查询一次来做到这一点

ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

文件编码

.php 文件本身采用 UTF-8 编码也很重要。如果您使用 Notepad++ 编写代码,这可以在任务栏上的“格式”下拉菜单中完成(Convert to UFT-8 w/o BOM)。你应该使用UTF-8 w/o BOM

如果您遵循上述所有指示,您的问题很可能会得到解决。如果没有,您可以查看这篇 *** 帖子:UTF-8 all the way through。

【讨论】:

如何检查我的文件是否为 UTF-8 编码。我正在使用brackets.io 进行编码 据我所知,Brackets 默认使用 UTF-8 w/o BOM(甚至不确定它们是否支持其他字符集?)。您是否也尝试过添加其他步骤? @learningbyexample 从我可以读到的其他 cmets 中,您使用的是 mysql_。所以,在你每个连接之后(在所有脚本/页面上),$conn = mysql_connect($host, $user, $pass);,你应该有mysql_set_charset("utf8"); 我忘了添加 mysql_set_charset("utf8");这行得通!感谢 *** 社区。​​span> 【参考方案2】:

你确定吗?您确定要从数据库中检索数据吗?话虽如此,大多数数据库都要求您以与您的问题不完全相同的方式保存数据。这确实有正当的安全原因。

【讨论】:

我正在使用 phpMyadmin 进行 mySQL 查询,是的,我使用“INSERT INTO database (value) VALUES ('$value')”插入它们;【参考方案3】:

您应该在插入查询之前使用 utf8_general_ci 作为数据库编码,您应该运行此查询

Mysql_query(" SET NAMES 'utf8'");

【讨论】:

仅当 OP 使用 Mysql_ 函数时,希望它们不是。 我使用的是 mysql_ 而不是 mysqli_ 为什么会这样不好? 任何 mysql_ 或 mysqli_,我的意思是你应该运行集合名称查询 mysql_query("SET NAMES 'utf8'");努力将我的数据正确插入数据库,但是当我尝试读取它时,问号仍然是错误的。 &lt;td&gt;&lt;?php echo $name= $row['name'];?&gt;&lt;/td&gt; 在查询中查找带有特殊字符的名称。其他查询完美(只有特殊字符不起作用)

以上是关于为啥我的 html 不显示从我的数据库中获取的特殊字符的主要内容,如果未能解决你的问题,请参考以下文章

为啥 getBlob() 从我的数据库中的 Blob 列中检索整数数据?

需要帮助了解为啥要从我的所有列表中删除数据

为啥谷歌 Admob 广告不显示

为啥我的 html 表单中的数据没有提交?

为啥我必须从我的 pom 中删除一个依赖项,然后再将其添加回来并安装以获取最新版本的 maven 包?

Webpack 从我的样式表中的内联 SVG 中去除标签,我不知道为啥