我在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,但这从未奏效。我还试图把元标签放在头标签中
<!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中插入数据时,它们会以随机字符出现。
有人知道为什么会发生这种事吗?
发生这种情况有几个原因。然而,重要的是,您的整行代码都使用相同的字符集,并且所有可以设置为特定字符集的函数都设置为相同。最广泛使用的是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(已降级,应转换为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++编写代码,可以在任务栏上的"格式"下拉菜单中完成(转换为UFT-8 w/o BOM)。您应该使用UTF-8 w/o BOM
如果你遵循以上所有的指示,你的问题很可能会得到解决。如果没有,您可以看看这篇StackOverflow文章:UTF-8。
你确定吗?你确定你正在从数据库中检索你的数据吗?话虽如此,大多数数据库都要求您以与您的问题不完全相同的方式保存数据。这确实有正当的安全理由。
在插入查询之前,您应该使用utf8_general_ci作为数据库编码。您应该运行此查询
Mysql_query(" SET NAMES 'utf8'");