昨天,我将网站移至新的托管服务器,但在使用 Unicode 文本时遇到了问题。
在旧的托管包中,相同的脚本工作正常,在新的托管中,Unicode 显示如下:
在这两个托管中,这是我使用的测试代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>Untitled 1</title>
</head>
<body>
<?
$host = '';
$user = '';
$pass = '';
$db = '';
$con = mysql_connect($host , $user , $pass) or die ("Connection could not established." .mysql_error() );
mysql_select_db($db , $con) or die ("Colud not select database" . mysql_error());
$sql = "select * from news_line where status='enable' order by date DESC";
$res = mysql_query($sql);
while($dat=mysql_fetch_array($res)){
echo $dat['news'];
}
mysql_close($con);
?>
</body>
</html>
什么可能会导致新托管中出现此行为?
最佳答案
有一些事情可能会导致您的编码像这样被破坏。不过,Unicode 本身并不是一种字符编码,我猜您正在谈论 UTF-8 编码(因为这就是您在 HTML header 中尝试的编码?)。
因此,整个代码管 Prop 有相同的字符集非常重要。如果不同,你可能会得到意想不到的结果,就像你现在一样。您需要考虑的总体思路是
- HTML header
- PHP header
- MySQL 连接
- 数据库/表
- 您实际的
.php
文件
您已经设置了 HTML header ,
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
但这并没有考虑 PHP 发送的数据,所以您还需要
<?php
header('Content-Type: text/html; charset=utf-8');
此行应放置在任何类型的输出之前(将其放在文件的顶部)。
接下来,我们需要检查连接。您正在使用旧的、过时的 mysql_
API,因此您需要
mysql_set_charset("utf8");
创建 MySQL 连接后(典型情况是在 mysql_select_db()
之后)。
对于您的数据库和表,您需要知道排序规则与字符集不同。但是,两者都应该是 UTF-8,并且您可以通过在 SQL 中运行这些查询来设置它
ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
最后,文件本身可能还需要进行 UTF-8 编码。如果您使用 Notepad++ 编写代码,则可以在任务栏上的“格式”下拉列表中完成此操作。您应该使用 UTF-8 w/o BOM
(请参阅 What's different between UTF-8 and UTF-8 without BOM? )。
注意:
已存储在数据库中的任何数据不一定具有此编码,因此,如果数据库中存在损坏的字符,并且您执行了所有这些步骤,则可能需要使用您的内容将内容重新上传到数据库正确的编码(只需再次提交内容)。如果您有大量数据,可以使用一些方法来批量执行此操作。虽然我自己从未使用过它,但我听说有人成功地使用 Force UTF8 ,但就像我说的,我自己从未使用过它。
<小时/>脚注:
您的代码使用了非常过时的 API,我强烈建议您研究 MySQLi 或 PDO。如果您这样做,请确保在处理变量的任何内容上使用准备好的语句。
mysql_*
函数自 PHP 5.5 起已被弃用(并且在 PHP 7 中完全删除),您应该 stop using them如果可以的话。您应该选择另一个允许您使用prepared statements的API (在处理变量时确实应该),例如 mysqli_*
或 PDO
- 参见choosing an API .
你也可以看看
关于php - 是什么原因导致 Unicode 显示为垃圾字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40734669/