php get中文漢字引數亂碼

2022-06-12 12:03:12 字數 1641 閱讀 1775

最近寫了個簡單的頁面,從瀏覽器中傳入中文引數(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 SqlServer 中文漢字亂碼

php sqlserver 中文漢字亂碼,用iconv函式轉換 查詢顯示的時候,從gb轉換為utf8 iconv gb2312 utf 8 row name 儲存提交資料,資料庫是gb2312編碼,從utf轉為gb pname iconv utf 8 gb2312 ignore post pname...

js中文引數亂碼

在js中或a href中,傳中文引數會出現亂碼,解決方案如下 var url loginservlet?name encodeuri document.getelementbyid username value servlet處理 string name request.getparameter n...

spring mvc 中文引數亂碼

最近做專案,springmvc的url中文引數亂碼 請求url http localhost 8080 supply supply list.htm?productname 測試 ishomepage 在後端 public string tosupplylist model model,string...