


下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、做java的web開發(fā)有段日子了,有個(gè)問題老是困擾著我,就是亂碼問題,基本 上是網(wǎng)上查找解決方案(網(wǎng)上資料真的很多),都是一大堆的介紹如何解決此類 的亂碼問題,但是沒幾個(gè)把問題的來(lái)龍去脈說清楚的,有時(shí)候看了些文章后,以為自己懂了,但是在開發(fā)中亂碼問題又像鬼魂一樣出來(lái)嚇人,真是頭大了!這篇文章是我長(zhǎng)時(shí)間和亂碼做斗爭(zhēng)的一些理解的積累,還希望有更多的朋友給出指點(diǎn) 和補(bǔ)充。form有2中方法把數(shù)據(jù)提交給服務(wù)器,get和post,分別說下吧。(一) get提交1. 首先說下客戶端(瀏覽器)的form表單用get方法是如何將數(shù)據(jù)編碼后提 交給服務(wù)器端的吧。對(duì)于get方法來(lái)說,都是把數(shù)據(jù)串聯(lián)在請(qǐng)求的 url
2、后面作為參數(shù),如: http:/localhost:8080/servlet?msg=abc(很常見的一個(gè)亂碼問題就要出現(xiàn)了,如果url中出現(xiàn)中文或其它特殊字符的話,女口: http:/localhost:8080/servlet?msg= 杭州,服務(wù)器端容易得到亂碼), url拼接完成后,瀏覽器會(huì)對(duì)url進(jìn)行URLencode,然后發(fā)送給服務(wù)器,URLencode 的過程就是把部分url做為字符,按照某種編碼方式(如:utf-8,gbk等)編碼 成二進(jìn)制的字節(jié)碼,然后每個(gè)字節(jié)用一個(gè)包含3個(gè)字符的字符串"xy"表示,其中xy為該字節(jié)的兩位十六進(jìn)制表示形式。我這里說的可能不清
3、楚,具體介紹 可以看下.URLEncoder類的介紹在這里。了解了 URL encode的過程, 我們能看到2個(gè)很重要的問題,第一:需要URLencode的字符一般都是非ASCII 的字符(籠統(tǒng)的講),再通俗的講就是除了英文字母以外的文字(如:中文,日 文等)都要進(jìn)行URL encode,所以對(duì)于我們來(lái)說,都是英文字母的url不會(huì)出現(xiàn)服務(wù)器得到亂碼問題,出現(xiàn)亂碼都是url里面帶了中文或特殊字符造成的;第 二: URLencode到底按照那種編碼方式對(duì)字符編碼?這里就是瀏覽器的事情了, 而且不同的瀏覽器有不同的做法,中文版的瀏覽器一般會(huì)默認(rèn)的使用GBK通過設(shè)置瀏覽器也可以使用UTF-8,可能不同
4、的用戶就有不同的瀏覽器設(shè)置,也就造 成不同的編碼方式,所以很多網(wǎng)站的做法都是先把url里面的中文或特殊字符用 javascript 做URLencode,然后再拼接url提交數(shù)據(jù),也就是替瀏覽器做了 URL encode,好處就是網(wǎng)站可以統(tǒng)一 get方法提交數(shù)據(jù)的編碼方式。完成了 URL encode,那么現(xiàn)在的url就成了 ASCII范圍內(nèi)的字符了,然后以iso-8859-1的 編碼方式轉(zhuǎn)換成二進(jìn)制隨著請(qǐng)求頭一起發(fā)送出去。這里想多說幾句的是,對(duì)于 get方法來(lái)說,沒有請(qǐng)求實(shí)體,含有數(shù)據(jù)的url都在請(qǐng)求頭里面,之所以用 URLencode,我個(gè)人覺的原因是:對(duì)于請(qǐng)求頭來(lái)說最終都是要用iso-8
5、859-1編碼方式編碼成二進(jìn)制的101010.的純數(shù)據(jù)在互聯(lián)網(wǎng)上傳送,如果直接將含有中文 等特殊字符做iso-8859-1編碼會(huì)丟失信息,所以先做 URL encode是有必要的。2。服務(wù)器端(tomcat)是如何將數(shù)據(jù)獲取到進(jìn)行解碼的。第一步是先把數(shù)據(jù)用iso-8859-1進(jìn)行解碼,對(duì)于get方法來(lái)說,tomcat獲 取數(shù)據(jù)的是ASCII范圍內(nèi)的請(qǐng)求頭字符,其中的請(qǐng)求url里面帶有參數(shù)數(shù)據(jù),如 果參數(shù)中有中文等特殊字符,那么目前還是URLe ncode后的XY犬態(tài),先停下,我們先說下開發(fā)人員一般獲取數(shù)據(jù)的過程。通常大家都是 request.getParameter(”name")
6、獲取參數(shù)數(shù)據(jù),我們?cè)趓equest對(duì)象或得的數(shù)據(jù) 都是經(jīng)過解碼過的,而解碼過程中程序里是無(wú)法指定,這里要說下,有很多新手說用request.setCharacterEncoding("字符集")可以指定解碼方式,其實(shí)是不可以的,看servlet的官方API說明有對(duì)此方法的解釋:Overrides the nameofthe character encoding used in the body of this request. This method must be called prior to read ing request parameters or read in
7、g in put using getReader().可以看出對(duì)于get方法他是無(wú)能為力的。那么到底用什么編碼方式 解碼數(shù)據(jù)的呢,這是tomcat的事情了,默認(rèn)缺省用的是iso-8859-1,這樣我們 就能找到為什么get請(qǐng)求帶中文參數(shù)為什么在服務(wù)器端得到亂碼了,原因是在客戶端一般都是用 UTF-8或GBK寸數(shù)據(jù)URL encode,這里用iso-8859-1 方式URL decoder顯然不行,在程序里我們可以直接Java代碼門冬1. new String(request.getParameter("name").getBytes("iso-8859-1&quo
8、t;),"客戶端指定的URL encode編碼方式")還原回字節(jié)碼,然后用正確的方式解碼數(shù)據(jù),網(wǎng)上的文章通常是在tomcat里面做個(gè)配置Xml代碼門1. <Connector port ="8080" protocol ="HTTP/1.1" maxThreads="150" con nectionTimeout ="20000" redirectPort ="8443" URIEncoding="GBK"/>這樣是讓tomcat在獲取數(shù)據(jù)后用
9、指定的方式 URLdecoder,URLdecoder的介紹 在這里(一) post 提交1. 客戶端(瀏覽器)的form表單用post方法是如何將數(shù)據(jù)編碼后提交給服務(wù)器 端的。在post方法里所要傳送的數(shù)據(jù)也要URLencode,那么他是用什么編碼方式的 呢?在 form 所在的 html 文件里如果有段 vmeta http-equiv="Content-Type" content="text/html; charset=字符集(GBK utf-8 等)"/>,那么 post 就會(huì)用此處指定的編碼方式編碼。一般大家都認(rèn)為這段代碼是為了讓瀏覽器知
10、道用什 么字符集來(lái)對(duì)網(wǎng)頁(yè)解釋,所以網(wǎng)站都會(huì)把它放在html代碼的最前端,盡量不出現(xiàn)亂碼,其實(shí)它還有個(gè)作用就是指定form表單的post方法提交數(shù)據(jù)的 URLencode編碼方式。從這里可以看出對(duì)于get方法來(lái)數(shù),瀏覽器對(duì)數(shù)據(jù)的URLencode的編碼方式是有瀏覽器設(shè)置來(lái)決定,(可以用js做統(tǒng)一指定),而post 方法,開發(fā)人員可以指定。2。服務(wù)器端(tomcat)是如何將數(shù)據(jù)獲取到進(jìn)行解碼的。如果用tomcat默認(rèn)缺省設(shè)置,也沒做過濾器等編碼設(shè)置,那么他也是用 iso-8859-1 解碼的,但是 request.setCharacterEncoding(”字符集")可以派上用場(chǎng)。我發(fā)
11、現(xiàn)上面說的tomcat所做的事情前提都是在請(qǐng)求頭里沒有指定編碼方式,如 果請(qǐng)求頭里指定了編碼方式將按照這種方式編碼。有2篇文章推薦下,地址分別是 ncain/articles/1321386.html;http:/wa nghua application/x-www-form-urlencoded禾廿 multipart/form-data在Form元素的語(yǔ)法中,EncType表明提交數(shù)據(jù)的格式用Enctype屬性指定將數(shù)據(jù)回發(fā)到服務(wù)器時(shí)瀏覽器使用的編碼類型。 下邊是說明: applicatio n/x-www-form-urle ncoded:窗體數(shù)據(jù)被編碼為名稱/值對(duì)。這是標(biāo)準(zhǔn)的編碼格式。
12、multipart/form-data :窗體數(shù)據(jù)被編碼為一條消息,頁(yè)上的每個(gè)控件對(duì)應(yīng)消 息中的一個(gè)部分。text/pla in:窗體數(shù)據(jù)以純文本形式進(jìn)行編碼,其中不含任何控件或格式字符。補(bǔ)充form 的 enctype 屬性為編碼方式,常用有兩種:application/x-www-form-urlencoded 禾口 multipart/form-data,默認(rèn)為 application /x-www-form-urlencoded。 當(dāng) action為get時(shí)候,瀏覽器用x-www-form-urlencoded的編碼方式把form 數(shù)據(jù)轉(zhuǎn)換成一個(gè)字串(name1=value1 & amp;name2=value2),然后把這個(gè)字串 append 至U url 后面,用?分割,加載這個(gè)新的url。當(dāng)action為post時(shí)候,瀏覽器把form 數(shù)據(jù)封裝到http body 中,然后發(fā)送到server 。 如果沒有type=file 的控件,用默認(rèn)的 application/x-www-
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 就業(yè)實(shí)習(xí)協(xié)議合同
- 雪域神舟-我的西部筆記現(xiàn)代文閱讀與創(chuàng)作啟發(fā)教案
- 2025年云浮下載b2貨運(yùn)從業(yè)資格證模擬考試考試
- 網(wǎng)絡(luò)程序設(shè)計(jì)作業(yè)指導(dǎo)書
- 2025年廣東貨運(yùn)從業(yè)考試試題
- 公司文化塑造與傳承實(shí)施指南
- 2025年鞍山職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能考試題庫(kù)新版
- 2025年貨運(yùn)從業(yè)資格證實(shí)操考試內(nèi)容
- 快遞運(yùn)單快遞服務(wù)合同
- 2025年上海貨運(yùn)從業(yè)資格考試題目及答案大全解析
- 2023年4月自考00160審計(jì)學(xué)試題及答案含解析
- 案卷評(píng)查培訓(xùn)課件模板
- 醫(yī)院死亡證明培訓(xùn)課件
- 市級(jí)優(yōu)質(zhì)課一等獎(jiǎng)《說和做》-七年級(jí)語(yǔ)文下冊(cè)同步課件(統(tǒng)編版)
- 《合同能源管理介紹》課件
- 機(jī)動(dòng)絞磨安全操作規(guī)程范本
- DL-T 2578-2022 沖擊式水輪發(fā)電機(jī)組啟動(dòng)試驗(yàn)規(guī)程
- 兆歐表的使用課稿
- 第四課探索認(rèn)識(shí)的奧秘(導(dǎo)學(xué)案)- 高中政治統(tǒng)編版必修四 哲學(xué)與文化
- 讀書分享小巴掌童話PPT
- 正常人體結(jié)構(gòu)題庫(kù)(含答案)
評(píng)論
0/150
提交評(píng)論