2011-12-02 88 views
17

我將我的網站從本地測試服務器移動到了NameCheap共享主機,現在我遇到了一個問題 - 有些頁面沒有正確顯示utf-8特殊字符(顯示問題標記)。與所有數據庫表一樣,所有頁面都是utf-8編碼的。奇怪的是,有些頁面顯示正確,有些顯示不正常,看起來是隨機的。utf-8特殊字符不顯示

例如,我的索引頁是好的,但我的個人資料頁不是。 faq.html工作正常,但是當我將它重命名爲faq.php時,它不會。而最奇怪的是,我有一個頁面有兩個JQuery選項卡,其中一個顯示正確,另一個不顯示!

有人可以幫我解決這個問題嗎?

+1

你是否使用開發工具檢查了編碼? (在大多數瀏覽器中爲F12) –

+0

是的,它表示所有頁面都是utf-8。 – robert

回答

42

這真的很煩人的問題來解決,但你可以嘗試這些。

首先,確保文件實際上是以UTF-8格式保存的。

然後檢查您的HTML標頭中是否有<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">

您也可以嘗試在PHP腳本的開頭調用header('Content-Type: text/html; charset=utf-8');或將AddDefaultCharset UTF-8添加到.htaccess文件中。

+1

我有我的標題中指定charset = utf-8的元標記。添加AddDeafultCHarset UTF-8到我的.htaccess沒有幫助。我寧願直接從PHP代碼中避免解決方案,因爲它是一個非常複雜的站點。 – robert

+4

我的問題通常是實際文件不是UTF-8格式。例如,如果瀏覽器將它讀取爲UTF-8,但實際文件不是,則ASCII的字符「ä」將顯示爲「?」。 – RCE

+0

實際的文件絕對是utf-8,並且它們在我的EasyPHP上完美運行。 – robert

6

聽起來像這樣,如果您請求faq.html,網絡服務器會向您的瀏覽器發出信號指示該文件採用UTF-8編碼。

用您的瀏覽器檢查發佈和使用哪種編碼,請查看瀏覽器的文檔如何做到這一點。每個瀏覽器都有這種功能,通常可以通過菜單訪問(指定您的偏好應使用哪種網站的編碼)並查看服務器返回的內容,通常可以在頁面屬性中找到它。

然後,聽起來像這樣,如果你請求faq.php,網絡服務器會發信號通知你的瀏覽器該文件是用其他編碼方式。根據默認的PHP配置設置,可能沒有字符集/編碼。因爲它是一個PHP文件,你可以經常通過改變PHP配置default_charsetDocs指令解決這個問題:

default_charset = "UTF-8" 

找到主機上的php.ini文件,並相應地對其進行編輯。

ini_set('default_charset', 'UTF-8'); 

小心你在你的腳本,因爲PHP很早就更改此:

如果你沒有在php.ini可用,則可以通過代碼以及通過使用ini_setDocs功能改變這種需要能夠發送標題才能使其發揮作用,並且如果標題已經發送,則不能再設置標題。

手動發送Content-Type頭線做的工作,太:

header('Content-Type: text/html; charset=UTF-8'); 

此外,它是很好的做法,所有的HTML頁面,你輸出有這個頭,以及他們的HTML <head>部分:

<html> 
    <head> 
    ... 
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> 
    ... 

希望這有幫助。在頭

+0

謝謝,但我沒有php.ini可用。 瀏覽器表示編碼爲utf-8,並且在所有瀏覽器中顯示相同。 我在我的頭中聲明瞭正確的編碼。無論如何,我已經嘗試將它添加到.htaccess,但沒有做任何事情。你認爲這可能是一個與主機帳戶問題? – robert

+0

使用ini_set顯示字符,但它不會讀取任何PHP內容! – robert

+0

如果瀏覽器報告UTF-8並且顯示不正確,那麼您的數據在某處出現故障。編碼就像一個鏈,如果一個元素錯了,最終的結果是錯誤的。注意並找到不工作的鏈條的元素。那麼「什麼是PHP內容」意味着什麼? – hakre

3

集meta標籤作爲

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /> 

使用鏈接http://www.i18nqa.com/debug/utf8-debug.html更換你想要的符號人物。

然後使用str_replace函數像

$find = array('“', '’', '…', 'â€」', 'â€「', '‘', 'é', 'Â', '•', 'Ëœ', 'â€'); // en dash 
         $replace = array('「', '’', '…', '—', '–', '‘', 'é', '', '•', '˜', '」'); 
$content = str_replace($find, $replace, $content); 

它我使用的方法和很多幫助。謝謝!

0

如果所有其他答案都不適用於您,請嘗試禁用HTTP輸入編碼轉換

這是與PHP擴展相關的設置mbstring。 這是我的情況的問題。此設置在我的服務器中默認啓用。

2

如果您使用的是PHP並且以上都無法工作(因爲這是我的情況),您需要使用utf-8編碼設置區域設置。

像這樣

setlocale(LC_ALL, 'fr_CA.utf-8'); 
1

的問題是,因爲你的文件不具有相同的編碼。 首先在您的所有文件運行以下命令:

file -i filename.* 

爲了修復你必須改變你的所有文件,以UFT-8的問題。您可以用命令的iconv做到這一點:

iconv -f fromcode -t tocode filename > newfilename 

例子:

iconv -f iso-8859-1 -t utf-8 index.html > fixed/index.html 

這之後您可以運行文件-i fixedx/index.html,然後你會看到你的文件現在是uft- 8