最近寫了個簡單的頁面,從瀏覽器中傳入中文引數(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 這樣可以處理,但是感覺很...