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

來源:互聯網
上載者:User

標籤:style   http   color   os   ar   使用   for   sp   div   

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

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

測試結果如下:

代碼中聲明了響應內容的編碼為utf-8,顯示的內容確實亂碼。在這裡請注意var_dump出變數的長度只有4 ,很顯然,兩個中文字的長度在utf-8編碼下肯定不止4個位元組,然後我們再看一下Firefox的訪問這個頁面url

FireFox會自動將中文url編碼,所以我們可以看到測試變成了%B2%E2%CA%D4,很明顯,這裡一個字是兩個位元組,是gb2313、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編碼。

除了上面的之外,還有以下情況會出現這種情況:

如果gbk編碼的頁面產生的地址連結到utf-8的頁面,gbk頁面的中文是按照gbk的格式編碼傳送給下個頁面,那麼utf-8編碼接收後肯定會出現亂碼。
IIS的url重寫模組,重寫後的中文編碼也是gbk,如果你的頁面是utf-8編碼,那麼重寫參數將會失效。像這些情況,我們就需要使用php內建的轉碼函數來處理編碼問題了:

方案1:

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

方案2:

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

 

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.