php接收GET方法傳入的中文參數亂碼問題

  最近作PHP的webService服務器,發現用Get方法獲取參數時獲取到的參數時亂碼。一番折騰後發現時瀏覽器本地語言的問題。 php

首先先來看下簡單的測試代碼:
  1. <?php  
  2. header("Content-Type:text/html;charset=UTF-8");  
  3. $name = $_GET['name'];  
  4. var_dump($name);  
  5. ?> 

測試結果以下: html

代碼中聲明瞭響應內容的編碼爲utf-8,顯示的內容確實亂碼。在這裏請注意var_dump出變量的長度只有4 ,很顯然,兩個中文字的長度在utf-8編碼下確定不止4個字節,而後咱們再看一下Firefox的訪問這個頁面url web

FireFox會自動將中文url編碼,因此咱們能夠看到測試變成了%B2%E2%CA%D4,很明顯,這裏一個字是兩個字節,是gb231三、gbk等中文編碼格式,而不是utf-8編碼。若是咱們把頁面的編碼切換爲gbk,中文參數就會顯示正常,參見下圖 瀏覽器

接下來咱們作另一個測試,代碼以下: 服務器

  1. <?php  
  2. header("Content-Type:text/html;charset=UTF-8");  
  3. $name = $_GET['name'];  
  4. var_dump($name);  
  5. ?>  
  6.  
  7. <form method="GET">  
  8. <input name="name" />  
  9. <input type="submit" value="輸入中文提交" />  
  10. </form> 

測試結果,正常顯示: 函數

那麼,是什麼致使這個問題的發生呢?
答案是瀏覽器默認編碼在做怪,咱們都用的是中文系統,瀏覽器默認的編碼天然也會設置爲本地化,例如我本身電腦上的IE和FireFox的默認編碼都是gb系列的。
瀏覽器在請求用戶輸入的url 時會默認把url中的中文以默認的編碼格式發送而不是以頁面的編碼格式發送,這就是爲何頁面中帶有中文的連接正常而咱們手動輸入的連接 測試

會亂碼的緣由。同理,若是咱們把瀏覽器的默認編碼調整爲utf-8,那麼輸入url中的中文則會按照utf-8編碼。 編碼

除了上面的以外,還有如下狀況會出現這種狀況: url

若是gbk編碼的頁面生成的地址連接到utf-8的頁面,gbk頁面的中文是按照gbk的格式編碼傳送給下個頁面,那麼utf-8編碼接收後確定會出現亂碼。
IIS的url重寫模塊,重寫後的中文編碼也是gbk,若是你的頁面是utf-8編碼,那麼重寫參數將會失效。像這些狀況,咱們就須要使用php內置的轉碼函數來處理編碼問題了: spa

方案1:

  1. $name = iconv("gbk","utf-8",$name); 

方案2:

  1. mb_convert_encoding($name, "utf-8", "gbk"); 

 

PS:實測IE瀏覽器默認GET編碼方式採用最少空間佔用模式,即採用GBK碼,php頁面添加該轉換函數才能正常使用。而Firefox和Chrom默認UTF-8無需該轉換函數。

相關文章
相關標籤/搜索