是什么原因导致Unicode显示为垃圾字符?

时间:2016-11-22 05:50:49

标签: php html mysql

昨天我将我的网站移到了一个新的托管服务器上,我遇到了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>

在新托管中可能会导致此行为?

1 个答案:

答案 0 :(得分:1)

有一些事情会导致您的编码像这样破坏。但是,Unicode本身并不是一种字符编码,我猜测你是在谈论UTF-8编码(因为这是你尝试使用HTML标题的吗?)。

因此,整个代码管道具有相同的字符集非常重要。如果它不同,您可能会像现在一样得到意想不到的结果。您需要考虑的一般概念是

  • HTML标题
  • PHP标题
  • MySQL连接
  • 数据库/表格
  • 您的实际.php档案

您已使用

设置HTML标头
<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 ++编写代码,可以在&#34;格式&#34;下拉任务栏。您应该使用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。您应该选择另一个API,允许您使用prepared statements(在处理变量时确实应该),例如mysqli_*或PDO - 见choosing an API

您还可以查看