昨天我将我的网站移到了一个新的托管服务器上,我遇到了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>
在新托管中可能会导致此行为?
答案 0 :(得分:1)
有一些事情会导致您的编码像这样破坏。但是,Unicode本身并不是一种字符编码,我猜测你是在谈论UTF-8编码(因为这是你尝试使用HTML标题的吗?)。
因此,整个代码管道具有相同的字符集非常重要。如果它不同,您可能会像现在一样得到意想不到的结果。您需要考虑的一般概念是
.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。
您还可以查看