關於jsp,ajax亂碼問題網上可以蒐集到一堆資料,可是大部分都是在講如何應用。我這裡主要說下我個人理解的瀏覽器端與伺服器端亂碼問題的根源與原理。
首先,要說明的是服務端(如:tomcat)與瀏覽器端(如:ie)底層實現都是基於socket通訊的(不了解的朋友可以自己去學習下socket )。那麼好的,如果各位自己實現socket通訊的話肯定會也會處理這個編碼問題。例如,我自己寫個socket實現,我規定socket兩端都採用"utf-8"編碼,那麼兩端的訊息接收肯定不會出現亂碼問題了。好的進一步擴充套件,如果我socket兩端都不限定編碼,並且socket客戶端訪問服務端接收到訊息後便暫時關閉。那麼各位該如何制定訊息接收完畢,訊息發出,編碼等一系列規則呢(恐怕大家到這裡就想到了這不就是http協議嗎 )。哦繼續,那麼現在我們就可以吧瀏覽器端(如ie)看成乙個socket的客戶端,伺服器端(如tomcat)就是乙個socket服務端(大家記好這裡 socket客戶端就是指 瀏覽器,socket服務端就是指的 伺服器,以後我可要用了啊)。
進入正題,首先說頁面顯示,瀏覽器socket客戶端接收到服務端的資料內容,那麼客戶端如何知曉服務端傳送的內容需要用什麼編碼格式展示呢。http協議規定,根據接收到的中的編碼格式來顯示頁面的。
response.setcontenttype("text/html;charset=gb2312")是設定頁面中為gb2312編碼,設定頁面靜態文字
response.setcontenttype指定 http 響應的編碼,同時指定了瀏覽器顯示的編碼.
response.setcharacterencoding設定http 響應的編碼,如果之前使用
response.setcontenttype設定了編碼格式,則使用
response.setcharacterencoding指定的編碼格式覆蓋之前的設定.
與response.setcontenttype相同的是,呼叫此方法,必須在getwriter執行之前或
者response被提交之前.
另外需要說明的是
response.setcontenttype("text/html; charset=utf-8");與頁面中
作用相同。
但如果response.setcontenttype("text/html; charset=utf-8");與頁面中
中都存在,則以response.setcontenttype("text/html; charset=utf-8");為
主.
然後說大家遇到比較多的問題,request.getparameter("")獲得的結果為亂碼這個問題。服務端根據http協議是通過「url編碼」來獲得客戶端socket提交的資訊的。如果不懂「url編碼」,大家這裡 ,我這裡給大家解釋下,
看乙個簡單頁面:
那麼這個post 方式的 form表單裡面的兩個值是如何傳送到後台的呢,
需要先將這兩個input的值轉化為gbk編碼**化為gbk編碼的原因過會再說),然後在將結果在進行「url編碼」,
例如我們傳送的兩個值分別是 username=你好 ,password=你好 .那麼最後提交的資料內容就會是
username=%c4%e3%ba%c3&password=%c4%e3%ba%c3。至於具體過程還要大家多多理解下「url編碼」.
這裡說說為什麼要用gbk對上面那個表單編碼,這裡恐怕大家同樣也猜到了,對就是這裡,
http協議的規定post提交的內容根據content-type的字元編碼型別進行編碼。
稍微做個總結:post提交的資料編碼格式
根據content-type,編碼後在進行
「url編碼」,然後傳送給服務端.
那麼到了這裡該說說get方式的提交了,或者說 url位址列的內容資訊提交(不懂這裡說的get方式,只能自己補下了)
好的,這裡大家可以這麼考慮(實際上也是這樣),url位址列的內容是可以手動輸入的,那麼這裡url的編碼便於作業系統環境有關係了,例如:中國的xp使用者 編碼格式為gbk,中國台灣的xp使用者 編碼格式為big5。而瀏覽器中socket便直接將url位址列裡面的內容提交上去了,什麼操作轉碼啊都沒有進行。哦,說到這裡,大家恐怕也理解了為什麼不同瀏覽器get提交的編碼格式不同(環境不同,預設編碼不同)。
ok說說服務端接收資訊的方式,即:request.getparameter(""). 服務端socket根據http協議(我自己的理解
好的綜上所述,做個總結:
1.客戶端瀏覽器顯示頁面的編碼根據,否則如果沒有設定這個地方的編碼,便與瀏覽器有關。
2.客戶端瀏覽器get提交的資料url中是什麼樣子,那麼後台獲得的便是什麼樣子。例如:瀏覽器預設環境對url是gbk編碼,那麼伺服器端獲得的內容便是gbk編碼。
3.post提交的資料編碼格式根據content-type,編碼後在進行「url編碼」,然後傳送給服務端.。同上,如果沒有設定這個地方的編碼格式,編碼格式便與瀏覽器有關。
4.服務端request.getparameter("")接收資料,首先進行一次解碼(不管是什麼資料型別,都要解碼 既: urldecoder.decode(url,charset))
其中如果是get方式提交的資料,這裡的charset便是與伺服器預設有關了例如:tomcat解碼預設為iso-8859-1.
如果是post方式提交的資料,這裡charset的值獲得方式為如下兩步:
(1)request.getcharacterencoding("utf-8"),如果獲得的編碼格式不為空,好的,解碼用這種格式(不走第二步了)如果獲得的編碼格式為空,好的只能進行第二步了
(2) 與伺服器預設post解碼格式 例如:tomcat解碼預設為iso-8859-1.
5.服務端與客戶端分開看,它們各自擁有著自己的編碼格式。至於怎麼編碼,就是我上面做的總結了。
大家在遇到亂碼問題是,多多考慮以上幾條。
另外著重說明:ajax post提交的資料麼有進行「url編碼」.(為什麼這麼實現,我也不清楚
MySql亂碼解決心得
最近使用mysql資料庫,無疑的遇到了亂碼的問題,從網上找了很多很多的文章,綜合一起才把亂碼問題給解決啦!開心之餘,寫寫我自己的解決過程,也算是以後給自己提個醒!方法一 解決亂碼第一步 安裝mysql資料庫後,在資料庫中的my.ini檔案中加上character set server utf8 我裝...
oracle出現亂碼解決心得
最近在家裡搞oracle的時候突然遇到一些亂碼的問題,下面介紹一下這些天總結的亂碼排除經驗 第一 首先要確定你待匯入的dmp檔案是否已經是帶亂碼的檔案 本人這次出現亂碼的原因就是因為公司開發環境的資料庫表al attr中的資料本來就已經是亂碼了,最可怕的是每次匯入資料的時候都以這張表進行測試的,以至...
oracle出現亂碼解決心得
最近在家裡搞oracle的時候突然遇到一些亂碼的問題,下面介紹一下這些天總結的亂碼排除經驗 第一 首先要確定你待匯入的dmp檔案是否已經是帶亂碼的檔案 本人這次出現亂碼的原因就是因為公司開發環境的資料庫表al attr中的資料本來就已經是亂碼了,最可怕的是每次匯入資料的時候都以這張表進行測試的,以至...