2011-12-16 88 views
4

我在編碼在我的網站有很多麻煩。

這是我的問題,現在,如果我去analize.php?dialog=árbol其代碼爲:

<? 
echo $_GET['dialog']; 
echo "sabía"; 

就可以了,我得到:

sabía 
sabía 

我使用ANSI,改變爲UTF-8兩者都打破。我不明白爲什麼會發生這種情況,也沒有任何代碼在上面。我不關心它們如何顯示,因爲這個文件只用於從我的數據庫中獲取數據。但我需要正確顯示$_GET,以便我可以將其包含在查詢中。

這怎麼辦?

+3

http://pokit.org/get/7570f6e4406588d65f28ffb3c50c4224.png – 2011-12-16 01:51:48

+1

你的源代碼保存爲什麼編碼?你解釋/提供文件的編碼是什麼? – deceze 2011-12-16 01:53:33

回答

5

您不能在URL中發送字符「í」,URL必須使用ASCII字符集的子集。因此,在將URL發送到服務器之前,您的瀏覽器將URL編碼爲?dialog=sab%C3%ADa%C3%AD表示兩個字節C3 AD,它是字符「í」的UTF-8編碼。您可以用var_dump($_SERVER['QUERY_STRING']);來確認。這由PHP自動解碼,結果是「sabía」的UTF-8字節序列,「í」使用兩個字節C3 AD進行編碼。

您的瀏覽器正在使用Windows-1252或ISO-8859-1字符集來解釋此字節序列。字節C3在此編碼中表示「×」,字節AD表示軟連字符並且不可見。

兩個可能的解決方案:

  1. 使用UTF-8無處不在(推薦!)

    • 你的源代碼保存爲UTF-8
    • 輸出強制瀏覽器的標題將該網站解讀爲UTF-8:

      header('Content-Type: text/html; charset=utf-8'); 
      
  2. 轉換$_GET值到Windows 1252/ISO-8859-1(或任何編碼,你想在網站上使用),即使在這種情況下使用mb_convert_encodingiconv(不推薦)

    • 你正是你使用的是什麼編碼

總之應設置宣佈到瀏覽器的標題,你需要確保你使用相同的編碼無處不在,並指定給瀏覽器的編碼正是是。