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

2021-06-02 13:20:52 字數 2038 閱讀 1719

php

接收get

中文引數亂碼深入研究

相信很多

phper

都會遇到這樣的問題:在

utf-8

的頁面下面,如果直接訪問帶有中文引數的位址如

test.php?s=

測試這樣的位址輸出引數的值會亂碼,在搜尋引擎上查詢了下相關資料,都只給出了一些解決方案,但是卻沒有人研究導致這個問題的原因,今天特寫此文來深入這個問題產生的原因:

首先我們演示這個問題,測試**和執行結果如下。

**:

測試結果:

**中宣告了響應內容的編碼為

utf-8

,顯示的內容確實亂碼。

在這裡請注意

var_dump

出變數的長度只有

4,很顯然,兩個中文字的長度在

utf-8

編碼下肯定不止

4個位元組

然後我們再看一下

firefox

的訪問這個頁面

url

firefox

會自動將中文

url編碼,所以我們可以看到測試變成了

%b2%e2%ca%d4

,很明顯,這裡乙個字是兩個位元組,是

gb2313

、gbk

等中文編碼格式,而不是

utf-8

編碼。

如果我們把頁面的編碼切換為

gbk,中文引數就會顯示正常,參見下圖

這時乙個有趣的問題就誕生了:像

emlog

的中文標籤這樣的引數怎麼就沒有亂碼呢?

多方測試後,我發現了乙個小小的區別:

emlog

如果我們直接輸入例如

原創這樣的鏈結,程式同樣會提示找不到標籤

測試**如下:

測試結果,正常顯示:

請注意上圖中紅框標出的

url編碼,這次測試兩個字是由

6個位元組組成,而不是先前的

2個位元組,因此表明中文引數已經正確的成為

utf-8

編碼。

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

答案是瀏覽器預設編碼

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

firefox

的預設編碼都是

gb系列的,請參看下圖:

ie的預設設定:

firefox

的預設設定:

正因為這個設定,讓瀏覽器在請求使用者輸入的

url時會預設把

url中的中文以預設的編碼格式傳送而不是以頁面的編碼格式傳送,這就是為什麼頁面中帶有中文的鏈結正常而我們手動輸入的鏈結會亂碼的原因。同理,如果我們把瀏覽器的預設編碼調整為

utf-8

,那麼輸入

url中的中文則會按照

utf-8

編碼。

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

如果gbk編碼的頁面生成的位址鏈結到

utf-8

的頁面,

gbk頁面的中文是按照

gbk的格式編碼傳送給下個頁面,那麼

utf-8

編碼接收後肯定會出現亂碼。

iis的url

重寫模組,重寫後的中文編碼也是

gbk,如果你的頁面是

utf-8

編碼,那麼重寫引數將會失效。

像這些情況,我們就需要使用

php內建的轉碼函式來處理編碼問題了:

方案1:

$str =iconv("gb2312","utf-8",$str);

方案2:

mb_convert_encoding($str,"utf-8", "gb2312");

希望本文對那些因為編碼問題而抓破頭的

phper

們有所幫助:)

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

最近寫了個簡單的頁面,從瀏覽器中傳入中文引數 test.php name 測試 不論怎麼設定utf 8的頁面中都顯示亂碼,google了一把也查到了不少解決辦法,但是問題的原因到底是什麼呢?沒有人深入研究這個問題。出於好奇便要好好查查到底是什麼原因導致,也算漲點經驗!首先先來看下簡單的測試 head...

get請求引數中文亂碼

最近遇到的問題,記錄一下,就是get提交中文引數,後台取值是亂碼 使用各種方法,前面幾種方式雖然沒解決問題,但為以後轉碼提供思路,因此mark下 1.js中使用encodeuri 對請求url編碼 2.後台使用urldecoder指定解碼 3.request使用setcharacterencodin...

SpringMVC接收引數中文亂碼問題

初學springmvc,碰見在controller中獲取引數中文亂碼的問題。檢查了一下web.xml已配置過濾器,如下 myencoding org.springframework.web.filter.characterencodingfilter encoding utf 8 forceenco...