php接收GET方法傳入的中文引數亂碼深究

2021-06-18 04:01:09 字數 1686 閱讀 5734

最近寫了個簡單的頁面,從瀏覽器中傳入中文引數(test.php

?name=測試),不論怎麼設定utf-8的頁面中都顯示亂碼,google了一把也查到了不少解決辦法,但是問題的原因到底是什麼呢?沒有人深入研究這個問題。出於好奇便要好好查查到底是什麼原因導致,也算漲點經驗!

首先先來看下簡單的測試**:

<?php

header("content-type:text/html;charset=utf-8");   

$name = $_get

['name'];   

var_dump($name);   

?>  

測試結果如下:

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

firefox會自動將中文url編碼,所以我們可以看到測試變成了%b2%e2%ca%d4,很明顯,這裡乙個字是兩個位元組,是gb2313、gbk等中文編碼格式,而不是utf-8編碼。如果我們把頁面的編碼切換為gbk,中文引數就會顯示正常,參見下圖

接下來我們做另外乙個測試,**如下:

<?php   

header("content-type:text/html;charset=utf-8");   

$name = $_get

['name'];   

var_dump($name);   

?>   

測試結果,正常顯示:

那麼,是什麼導致這個問題的發生呢?

答案是瀏覽器預設編碼在作怪,我們都用的是中文系統,瀏覽器預設的編碼自然也會設定為本地化,例如我自己電腦上的ie和firefox的預設編碼都是gb系列的。

瀏覽器在請求使用者輸入的url 時會預設把url中的中文以預設的編碼格式傳送而不是以頁面的編碼格式傳送,這就是為什麼頁面中帶有中文的鏈結正常而我們手動輸入的鏈結

會亂碼的原因。同理,如果我們把瀏覽器的預設編碼調整為utf-8,那麼輸入url中的中文則會按照utf-8編碼。

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

如果gbk編碼的頁面生成的位址鏈結到utf-8的頁面,gbk頁面的中文是按照gbk的格式編碼傳送給下個頁面,那麼utf-8編碼接收後肯定會出現亂碼。

iis的url重寫模組,重寫後的中文編碼也是gbk,如果你的頁面是utf-8編碼,那麼重寫引數將會失效。像這些情況,我們就需要使用php內建的轉碼函式來處理編碼問題了:

方案1:

$name = iconv

("gbk","utf-8",$name);  

方案2:

mb_convert_encoding

($name, "utf-8", "gbk");  

PHP接收GET中文引數亂碼深入研究

php 接收get 中文引數亂碼深入研究 相信很多 phper 都會遇到這樣的問題 在 utf 8 的頁面下面,如果直接訪問帶有中文引數的位址如 test.php?s 測試這樣的位址輸出引數的值會亂碼,在搜尋引擎上查詢了下相關資料,都只給出了一些解決方案,但是卻沒有人研究導致這個問題的原因,今天特寫...

POST請求傳入中文引數,接收端亂碼

追蹤過程 介面採用post請求進行,無法收取簡訊的介面 如下 public static string sendpost string url,mapparammap param new stringbuilder param.substring 0,param.length 1 傳送請求引數 ou...

http的get請求中文傳入後台後變亂碼。

做介面測試的時候,在瀏覽器中引數輸入中文傳入後台是亂碼,雖然解決方法很多。在js採用 encodeuri,在後台 接受時,需處理string str new string request.getparameter param getbytes iso8859 1 utf 8 這樣可以處理,但是感覺很...