顯然,只有傳送端和接收端指代的是同樣的內容,我們才能得到正確的結果。那麼,對於一次搜尋請求中關鍵字的提交,我們有3種方式,簡稱發1,發2,發3:
(發1)表單post提交
(發2)表單get提交
(發3)將搜尋項直接內含在url裡,如春節 。
先來討論發1和發2情況。
在阮一峰的這篇文章中,我們看到,對於get和post,在頁面進行提交的時候,提交過去的編碼,就是提交頁面的字元編碼。所不同的是,如果採用的是get方式,對於中文,瀏覽器還會依照當前字元編碼做url編碼,那麼如果是get提交過去的,接收方還要按照約定先做一次url解碼。
這樣看,如果提交方、接收方是同一字元編碼,則不會有神碼問題。
然而事情不會是這麼簡單,單就簡體中文世界來講,就有gb2312 , gbk , gb18030 , utf-8幾種常見的字元編碼。對於gb系之間,除了使用特別罕用的考驗人品的字元之外,其他一般可以認為是一種編碼。但是gb系和utf-8之間互相提交常常會出現問題。比如我們前文提到的就是utf-8頁面向gbk頁面提交的情形。當編碼到達接收方,接收方執拗地用自己的字元編碼來解釋另一種字元編碼,於是神碼出沒。
好吧,那問題從巨集觀上有了兩種解決思路,簡稱解1,解2:
(解1) 傳送方把自己的提交的字元編碼變成接收方的字元編碼
對於gb係向utf-8提交,這個方法是可行的。js的encodeuricomponent方法,會強制把提交引數換成utf-8. 參見拔赤的這篇文章
對於utf-8向gb系提交,這個方法有些複雜。網上有一些偏方,各有缺陷,所列如下:
解決方案
缺陷
設定form的accept-charset,置為gb系
ie系列不支援,甚至ie9
針對ie設定form的document.charset
頁面不能多次提交,從第二次開始亂碼
載入乙個對應列表,提交前使用hash轉碼
列表體積可能會是乙個問題,不過對於內部系統,或者要求速度不苛刻的站點可以使用。
針對ie,使用vbs,進行轉碼
ieonly,且不是每個字元都能無誤地轉碼
引入後端proxy先提交到傳送端的域,通過後端程式轉碼,之後提交給接收端
小題大做,影響效率。
好吧,對於ie,我們又一次給跪了。
綜上,對於utf-8向gb系提交,在傳送端無解。
(解2) 傳送方告訴接收方編碼,接收方據此把提交過來的字元編碼轉化為自己需要的編碼,然後完成搜尋
這也是現在各大搜尋引擎的標準做法。他們提供乙個ie引數(input encoding), 表示輸入的字元編碼。
無論是utf-8向gb系提交還是gb係向utf-8提交,甚至之後接收方需要轉變字元編碼,這個做法都屬於屢試不爽型。這也是目前處理這類問題的首選做法。
綜上,我們對於發1和發2兩種情況,選擇解二作為解決方案
現在再來說說發3的情況
這種url很可能是接收端提供者,為了獲取較易讀的url,在伺服器端做的url路由,但實際上 發3 所列的並不是標準的url。上面提到的url編碼會要求把中文字元進行url編碼。因為標準中沒有提到如何編碼,所以瀏覽器在此,會有不同的處理方案。事實上,ie8及以上的瀏覽器,firefox,chrome等瀏覽器會把中文變成utf-8編碼進行處理。但是ie6/7 ,會使用系統預設編碼作為傳送方式。因此這樣直接採用中文是不安全的, 接收端也會做大量的工作去普適各種編碼。不過好在,我們有乙個encodeuri利器,這樣我們可以在傳送時候將中文做一次編碼強制轉為utf-8 , 接收端統一按utf-8處理就可以了。
現在我們來總結下這篇文章的結論:
1,對於get/post方式,傳送方提供乙個ie引數,用來表示提供的字元編碼,接收方據此進行轉碼後,完成搜尋和展示。
2,對於url直接帶有中文(非get引數)時,傳送端在傳送前用encodeuricomponent將查詢串進行編碼,接收方按utf-8接收。
mysql亂碼 解決網頁中亂碼的問題
1.將 編碼設為 utf 8,這樣可以相容世界上所有字元 2.如果 已經運作了好久,已有很多舊資料,不能再更改簡體中文的設定,那麼建議將頁面的編碼設為 gbk,gbk與gb2312的區別就在於 gbk能比gb2312顯示更多的字元,要顯示簡體碼的繁體字,就只能用gbk 4.在編寫connection...
linux下網頁亂碼的問題
開始以為是字符集有問題 經過網上排查確定為 linux 沒有安裝中文字符集 於是開始安裝中文字符集 1 簡單的yum命令 首先為了順利完成今天的任務我們要介紹幾個最簡單的yum命令 yum install 軟體的名稱 安裝軟體 yum remove 軟體的名稱 刪除軟體 yum list 軟體的名稱...
ajax中文亂碼最終解決,網頁亂碼問題心得
用過ajax的人都會碰到中文亂碼,網上基然有很多方法,但看完之後,很多人仍然解決不了亂碼問題,為什麼有的網頁始終都會返回亂碼,不管怎麼設定呢?本人經研究終於解決,其實是個很原理的問題,但因為現在不知道底層原理而做高階應用是主流人群,所以會有很多人不知道,包括我自己.說到網頁的編碼,要分兩分部分,一部...