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

标签 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>

什么可能会导致新托管中出现此行为?

最佳答案

有一些事情可能会导致您的编码像这样被破坏。不过,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/

相关文章:

php - 如何在 html 中用双百分号(%%variable%%)括起来的 PHP 变量使用

javascript - ID不存在,虽然它存在

php - GIF 上的黑色背景而不是 PHP 中使用 imagegif() 的透明度

php - fetch_array 到 PDO

PHP 关闭 MySQL 连接

php - 具有现有值的 PDO 更新表?

html - HTML定位问题-放在一边,页脚,填充

php - 对表的sql条件查询

php - 如何使用 while 循环将 4 个项目排成一行?

MySQL - 如何按投票总和进行连接和排序?