關於java web中的解碼與編碼

2021-06-20 10:35:11 字數 3995 閱讀 2967

一.html表單,用get和post提交資訊到servlet

1.這個html標籤裡面的屬性的是告訴瀏覽器的編碼。個人覺得可以這樣理解,你編寫乙個html檔案,然後你在body裡面輸入了中文。這裡的charset的值就是表明html製作使用的語言。那麼當瀏覽器要顯示這個html頁面的時候,就知道這個頁面是用什麼字元顯示了!就不會出現亂碼了!還有乙個作用就是頁面編碼!

比如這裡設定為 charset=iso-8859-1,那麼在編輯這個頁面的時候就不能輸入中文了。如果這裡設定了big-5,編輯這個頁面的時候就不能使用簡體中文了!

2.這裡面請求的過程主要可以歸納為以下:客戶端網頁傳送乙個請求,瀏覽器將自動根據這個頁面所使用的字符集來對漢字進行編碼之後(這裡就要用到上面說的,meta的頁面編碼了),傳輸到伺服器。然後伺服器通過字符集來解碼。然後伺服器端再把所需要返回的資訊通過字符集編碼,再傳到客戶端的瀏覽器,瀏覽器進行解碼!這裡涉及到了2次解碼與編碼。

3.get方法請求頁面

get方法請求資訊的時候是把form表單的資訊直接放到url位址裡面的,具體的體現就是在request資訊中體現在query string parameters中。

①傳輸的中文資訊,通過頁面編碼格式進行url編碼(也就是meta裡面的charset的編碼格式)傳輸到服務端

url編碼規則:

url編碼遵循下列規則: 每對name/value由&;符分開;每對來自表單的name/value由=符分開。如果使用者沒有輸入值給這個name,那麼這個name還是出現,只是無值。任何特殊的字元(就是那些不是簡單的七位ascii,如漢字)將以百分符%用十六進製制編碼,當然也包括象 =,&;,和 % 這些特殊的字元。其實url編碼就是乙個字元ascii碼的十六進製制。不過稍微有些變動,需要在前面加上「%」。比如「\」,它的ascii碼是92,92的十六進製制是5c,所以「\」的url編碼就是%5c。那麼漢字的url編碼呢?很簡單,看例子:「胡」的ascii碼是-17670,十六進製制是bafa,url編碼是「%ba%fa」。 ②

string xx = request.getparameter("xx"); 

服務端通過字符集來進行解碼,而tomcat用的預設字符集是iso-8859-1,所以如果這樣子對所傳過來的十六進製製碼進行解碼的肯定是不對的(因為解碼和編碼必須對應可以參考如果現在直接在控制台輸出xx的話得到的將會是亂碼。那麼該怎麼才能獲得我們需要的資料呢?

可以這樣子

string xx = new string(request.getparameter("text").getbytes("iso-8859-1"),"aa")  (aa為html的頁面編碼格式)。這樣在控制台打出就不會出現亂碼了!(注意這裡用request.setcharacterencoding這個函式是不起作用的。)

每次這麼弄也麻煩,那麼就可以通過改變tomcat的這個預設的字符集編碼。可以通過修改server.xml檔案中的下面的語句,加上uriencoding=「xx「(這裡的xx為常用的html的頁面編碼格式)的配置即可:。

③.伺服器把需要傳輸的資訊通過編碼傳到客戶端(瀏覽器),瀏覽器通過解碼來獲取資訊!

這裡又涉及到乙個編碼和解碼,而在伺服器端則預設使用iso-8859-1

進行編碼成

byte

,等到了瀏覽器,發現

response

的資訊header

中沒有相關編碼設定,就會去取

window

系統的編碼格式,中文系統預設為

gbk/gb2312

。所以,列印出來的頁面的瀏覽器編碼格式為

gb2312

。而如果設定了

response

的編碼格式,那麼就算到了瀏覽器,瀏覽器解析也會按照設定的字符集解碼。這裡設定的方法可以有setcontenttype()和setcharacterencoding()。response.setcharacterencoding設定http 響應的編碼,如果之前使用response.setcontenttype設定了編碼格式,則使用response.setcharacterencoding指定的編碼格式覆蓋之前的設定。

4.post方法請求頁面

post把提交的資料則放置在是http包的包體中具體體現就是request資訊中體現在form data中。

①傳輸的中文資訊,通過頁面編碼格式進行url編碼(也就是meta裡面的charset的編碼格式)傳輸到服務端

url編碼規則:

url編碼遵循下列規則: 每對name/value由&;符分開;每對來自表單的name/value由=符分開。如果使用者沒有輸入值給這個name,那麼這個name還是出現,只是無值。任何特殊的字元(就是那些不是簡單的七位ascii,如漢字)將以百分符%用十六進製制編碼,當然也包括象 =,&;,和 % 這些特殊的字元。其實url編碼就是乙個字元ascii碼的十六進製制。不過稍微有些變動,需要在前面加上「%」。比如「\」,它的ascii碼是92,92的十六進製制是5c,所以「\」的url編碼就是%5c。那麼漢字的url編碼呢?很簡單,看例子:「胡」的ascii碼是-17670,十六進製制是bafa,url編碼是「%ba%fa」。 ②

string xx = request.getparameter("xx"); 

服務端通過字符集來進行解碼,而tomcat用的預設字符集是iso-8859-1,所以如果這樣子對所傳過來的十六進製製碼進行解碼的肯定是不對的(因為解碼和編碼必須對應可以參考如果現在直接在控制台輸出xx的話得到的將會是亂碼。那麼該怎麼才能獲得我們需要的資料呢?

可以這樣子

string xx = new string(request.getparameter("text").getbytes("iso-8859-1"),"aa")  (aa為html的頁面編碼格式)。這樣在控制台打出就不會出現亂碼了!

這裡也可以用request.setcharacterencoding(「aa」)來設定編碼格式!(這裡修改server.xml就沒有用了)

③.伺服器把需要傳輸的資訊通過編碼傳到客戶端(瀏覽器),瀏覽器通過解碼來獲取資訊!

這裡又涉及到乙個編碼和解碼,而在伺服器端則預設使用iso-8859-1進行編碼成byte,等到了瀏覽器,發現response的資訊header中沒有相關編碼設定,就會去取window系統的編碼格式,中文系統預設為gbk/gb2312。所以,列印出來的頁面的瀏覽器編碼格式為gb2312。而如果設定了response的編碼格式,那麼就算到了瀏覽器,瀏覽器解析也會按照設定的字符集解碼。這裡設定的方法可以有setcontenttype()和setcharacterencoding()。response.setcharacterencoding設定http 響應的編碼,如果之前使用response.setcontenttype設定了編碼格式,則使用response.setcharacterencoding指定的編碼格式覆蓋之前的設定。

二.jsp作為客戶端,用get和post提交資訊到servlet

基本上和html的get和post的是一樣的!但是有乙個地方不同!那就是

jps的頁面有3處地方涉及到編碼與解碼:1.pageencoding 2.contenttype 3.meta標籤

那麼作為客戶端提交form表單的話,頁面的編碼的遵循順序是contenttype>pageencoding,即如果contenttype設定過了的話就用contenttype,如果沒有設定的話就用pageencoding。meta標籤暫時沒有發現在這個過程中起到了什麼作用!

三.jsp作為服務端處理資訊。

當接受到正確的資訊以後jsp服務端,就會對資料進行編碼,然後傳到瀏覽器,瀏覽器進行解碼!那麼這裡面的編碼和解碼規則是怎麼樣呢?預設當然是iso-8859-1,和servlet是一樣的,可以用setcharacterencoding()方法,也可以用pageencoding和contenttype ,但是這裡和html中不同的是setcontenttype()方法失效!並且setcharacterencoding()>contenttype>pageencoding.

Java Web中涉及的編譯碼

url的組成部分 以tomcat伺服器為例子,其中port,contextpath在server.xml中配置 servletpath在web應用的web.xml中的中配置,pathinfo 是我們請求的具體的 servlet,querystring 是要傳遞的引數,注意這裡是在瀏覽器裡直接輸入 u...

關於html servlet msql中的編碼問題

今天自己嘗試連線阿里雲的資料庫,但插入的中文資料始終為亂碼。最後解決了,思路如下 1.html本身的編碼問題,在html裡面設定。2.servlet獲取傳遞過來的引數問題,進行打樁測試,輸出在控制台。發現request.setcharacterencoding utf 8 僅對post請求有效,ge...

關於BeautifulSoup中字元的編碼

在使用beautifulsoup解析html檔案的過程中,經常使用到類似如下的語句 soup beautifulsoup html for string in soup.strings string string.strip 注意,上述 中,沒有對string的編碼進行任何的設定,所以string的...