2016-11-22 70 views
0

昨天我將我的網站移動到一個新的託管服務器,並且遇到了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

您正在使用的術語「* Unicode的*」,如果它是一個字符編碼。 [這不是。](http://www.joelonsoftware.com/articles/Unicode.html) – Biffen

+0

你爲什麼要用代碼片段編寫php代碼? – Tiger

回答

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連接(典型的是mysql_select_db()後)需要

mysql_set_charset("utf8"); 

至於你的數據庫和表格,你需要知道整理和charset不一樣。但是,這兩個應該是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。您應該選擇另一個API,允許您使用prepared statements(其中確實應該在處理變量時應該使用),如mysqli_*或PDO - 請參閱choosing an API


你也可以看看

相關問題