为什么我的 html 不显示从我的数据库中提取的特殊字符
why does my html not display special characters taken from my database
我将其包含在我的 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 但这没有用 我还尝试将 meta 标签放在 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 中插入它们时,它们以随机字符出现。
有人知道为什么会这样吗?
你确定吗?您确定要从数据库中检索数据吗?话虽如此,大多数数据库都要求您以与您的问题不完全相同的方式保存数据。这确实有正当的安全原因。
你应该使用 utf8_general_ci 作为数据库编码,在插入查询之前你应该 运行 这个查询
Mysql_query(" SET NAMES 'utf8'");
发生这种情况的原因有多种。但是,重要的是您的整行代码都使用同一组字符集,并且所有可以设置为特定字符集的函数都设置为相同。使用最广泛的是 UTF-8,这是我建议您使用的一种。
连接
- 您还需要在连接本身中指定字符集。
- PDO(对象本身指定):
$handler = new PDO('mysql:host=localhost;dbname=database;charset=utf8', 'username', 'password', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET UTF8"));
- MySQLi:(创建连接后直接放置)
* 对于 OOP:$mysqli->set_charset("utf8");
* 对于程序:mysqli_set_charset($mysqli, "utf8");
(其中 $mysqli
是 MySQLi 连接)
- MySQL(depricated,你应该转换成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++ 编写代码,可以在任务栏上的 "Format" 下拉菜单中完成(Convert to UFT-8 w/o BOM ).你应该使用 UTF-8 w/o BOM
.
如果您遵循以上所有指示,您的问题很可能会得到解决。如果没有,你可以看看这个 Whosebug post: UTF-8 all the way through。
我将其包含在我的 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 但这没有用 我还尝试将 meta 标签放在 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 中插入它们时,它们以随机字符出现。
有人知道为什么会这样吗?
你确定吗?您确定要从数据库中检索数据吗?话虽如此,大多数数据库都要求您以与您的问题不完全相同的方式保存数据。这确实有正当的安全原因。
你应该使用 utf8_general_ci 作为数据库编码,在插入查询之前你应该 运行 这个查询
Mysql_query(" SET NAMES 'utf8'");
发生这种情况的原因有多种。但是,重要的是您的整行代码都使用同一组字符集,并且所有可以设置为特定字符集的函数都设置为相同。使用最广泛的是 UTF-8,这是我建议您使用的一种。
连接
- 您还需要在连接本身中指定字符集。
- PDO(对象本身指定):
$handler = new PDO('mysql:host=localhost;dbname=database;charset=utf8', 'username', 'password', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET UTF8"));
- MySQLi:(创建连接后直接放置)
* 对于 OOP:$mysqli->set_charset("utf8");
* 对于程序:mysqli_set_charset($mysqli, "utf8");
(其中$mysqli
是 MySQLi 连接) - MySQL(depricated,你应该转换成PDO或者MySQLi):(直接放置创建连接后)
mysql_set_charset("utf8");
- PDO(对象本身指定):
数据库
您的 数据库 及其所有表都必须设置为 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++ 编写代码,可以在任务栏上的 "Format" 下拉菜单中完成(Convert to UFT-8 w/o BOM ).你应该使用UTF-8 w/o BOM
.
如果您遵循以上所有指示,您的问题很可能会得到解决。如果没有,你可以看看这个 Whosebug post: UTF-8 all the way through。