版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
JavaWeb中的中文編碼問題
--學(xué)習(xí)筆記你將了解到:在java中經(jīng)常遇到的幾種編碼格式的區(qū)別;在java中經(jīng)常需要編碼的場(chǎng)景;出現(xiàn)中文問題的原因分析;開發(fā)JavaWeb程序時(shí)可能存在編碼問題的幾個(gè)地方;一個(gè)Http請(qǐng)求怎么控制編碼格式;如何避免出現(xiàn)中文編碼問題。為什么要編碼?比較通俗的講解就是:只要不是說英語的國(guó)家,要使用計(jì)算機(jī)就必須經(jīng)過編碼,這是現(xiàn)狀。如果可以把計(jì)算機(jī)中存儲(chǔ)信息的最小單位改成漢字,這樣我們就不存在編碼問題了。字節(jié)字符如何“翻譯”常見的編碼格式有ASCII,ISO-8859-1,GB2312,GBK,UTF-8,UTF-16
(GB2312,GBK,UTF-8,UTF-16都可以表示中文)參考文獻(xiàn):https:///question/23374078幾種編碼格式的比較
GB2312與GBK編碼規(guī)則類似,但是GBK范圍更大,它能處理所有漢字字符,所以GB2312與GBK比較應(yīng)該選擇GBK。UTF-8編碼與GBK和GB2312不同,不用查碼表,所以在編碼效率上UTF-8的效率會(huì)更好,所以在存儲(chǔ)中文字符時(shí)UTF-8編碼比較理想。相對(duì)來說UTF-16編碼效率最高,字符到字節(jié)相互轉(zhuǎn)換更簡(jiǎn)單,進(jìn)行字符串操作也更好。如Java的內(nèi)存編碼就是采用UTF-16編碼。但是它不適合在網(wǎng)絡(luò)之間傳輸,因?yàn)榫W(wǎng)絡(luò)傳輸容易損壞字節(jié)流,一旦字節(jié)流損壞將很難恢復(fù)。UTF-8在編碼效率上和編碼安全性上做了平衡,是理想的中文編碼方式。Java中需要編碼的場(chǎng)景磁盤I/O
網(wǎng)絡(luò)I/O
JavaWeb中可能會(huì)存在編碼轉(zhuǎn)換用戶從瀏覽器端發(fā)起一個(gè)HTTP請(qǐng)求,需要存在編碼的地方是URL、Cookie、Parameter。服務(wù)器端接受到HTTP請(qǐng)求后要解析HTTP協(xié)議,其中URI、Cookie和POST表單參數(shù)需要解碼;服務(wù)器端可能還需要讀取數(shù)據(jù)庫(kù)中的數(shù)據(jù),本地或網(wǎng)絡(luò)中其它地方的文本文件,這些數(shù)據(jù)都可能存在編碼問題。一次HTTP請(qǐng)求的編碼示例
URL的幾個(gè)組成部分
GET
和POST兩種方式GET方式HTTP請(qǐng)求的QueryString與POST方式HTTP請(qǐng)求的表單參數(shù)都是作為Parameters保存,都是通過request.getParameter獲取參數(shù)值。對(duì)它們的解碼是在request.getParameter方法第一次被調(diào)用時(shí)進(jìn)行的。Get對(duì)Header中的項(xiàng)進(jìn)行解碼也是在調(diào)用request.getHeader是進(jìn)行的,如果請(qǐng)求的Header項(xiàng)沒有解碼則調(diào)用MessageBytes的toString方法,這個(gè)方法將從byte到char的轉(zhuǎn)化使用的默認(rèn)編碼也是ISO-8859-1,而我們也不能設(shè)置Header的其它解碼格式,所以如果你設(shè)置Header中有非ASCII字符解碼肯定會(huì)有亂碼。解決辦法:使用org.apache.catalina.util.URLEncoder編碼然后再添加到Header中(或js帶的編碼fun),服務(wù)器接收以后按照相應(yīng)的字符集解碼就好了。PostPOST表單參數(shù)傳遞方式與QueryString不同,它是通過HTTP的BODY傳遞到服務(wù)端的。當(dāng)我們?cè)陧?yè)面上點(diǎn)擊submit按鈕時(shí)瀏覽器首先將根據(jù)ContentType的Charset編碼格式對(duì)表單填的參數(shù)進(jìn)行編碼然后提交到服務(wù)器端,在服務(wù)器端同樣也是用ContentType中字符集進(jìn)行解碼。所以通過POST表單提交的參數(shù)一般不會(huì)出現(xiàn)問題,而且這個(gè)字符集編碼是我們自己設(shè)置的,可以通過request.setCharacterEncoding(charset)來設(shè)置。JSP設(shè)置編碼格式:
<%@pagecontentType="text/html;charset=UTF-8"%>
在JSP標(biāo)準(zhǔn)的語法中,如果pageEncoding屬性存在,那么JSP頁(yè)面的字符編碼方式就由pageEncoding決定,否則就由contentType屬性中的charset決定,如果charset也不存在,JSP頁(yè)面的字符編碼方式就采用默認(rèn)的ISO-8859-1。常見問題分析
中文變成了看不懂的字符例如,字符串“淘!我喜歡!”變成了“ì?£??ò?2??£?”編碼過程如下圖所示字符串在解碼時(shí)所用的字符集與編碼字符集不一致導(dǎo)致漢字變成了看不懂的亂碼,而且是一個(gè)漢字字符變成兩個(gè)亂碼字符。一個(gè)漢字變成一個(gè)問號(hào)例如,字符串“淘!我喜歡!”變成了“??????”編碼過程如下圖所示將中文和中文符號(hào)經(jīng)過不支持中文的ISO-8859-1編碼后,所有字符變成了“?”,這是因?yàn)橛肐SO-8859-1進(jìn)行編解碼時(shí)遇到不在碼值范圍內(nèi)的字符時(shí)統(tǒng)一用3f表示,這也就是通常所說的“黑洞”,所有ISO-8859-1不認(rèn)識(shí)的字符都變成了“?”。一個(gè)漢字變成兩個(gè)問號(hào)例如,字符串“淘!我喜歡!”變成了“????????????”編碼過程如下圖所示
這種情況比較復(fù)雜,中文經(jīng)過多次編碼,但是其中有一次編碼或者解碼不對(duì)仍然會(huì)出現(xiàn)中文字符變成“?”現(xiàn)象,出現(xiàn)這種情況要仔細(xì)查看中間的編碼環(huán)節(jié),找出出現(xiàn)編碼錯(cuò)誤的地方。一種不正常的正確編碼還有一種情況是在我們通過request.getParameter獲取參數(shù)值時(shí),當(dāng)我們直接調(diào)用Stringvalue=request.getParameter(name);會(huì)出現(xiàn)亂碼,但是如果用下面的方式Stringvalue=String(request.getParameter(name).getBytes("ISO-8859-1"),"GBK");解析時(shí)取得的value會(huì)是正確的漢字字符,這種情況是怎么造成的呢?看下如所示:這種情況是這樣的,ISO-8859-1字符集的編碼范圍是0000-00FF,正好和一個(gè)字節(jié)的編碼范圍相對(duì)應(yīng)。這種特性保證了使用ISO-8859-1進(jìn)行編碼和解碼可以保持編碼數(shù)值“不變”。雖然中文字符在經(jīng)過網(wǎng)絡(luò)傳輸時(shí),被錯(cuò)誤地“拆”成了兩個(gè)歐洲字符,但由于輸出時(shí)也是用ISO-8859-1,結(jié)果被“拆”開的中文字的兩半又被合并在一起,從而又剛好組成了一個(gè)正確的漢字。雖然最終能取得正確的漢字,但是還是不建議用這種不正常的方式取得參數(shù)值,因?yàn)檫@中間增加了一次額外的編碼與解碼,這種情況出現(xiàn)亂碼時(shí)因?yàn)門omcat的配置文件中useBodyEncodingForURI配置項(xiàng)沒有設(shè)置為”true”,從而造成第一次解析式用ISO-8859-1來解析才造成亂碼的。CharacterEncodingFilter-org.springframework.web.filter.CharacterEncodingFilter
常用編碼工具Jsscape
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 直飲水供水項(xiàng)目節(jié)能評(píng)估報(bào)告
- 2025年廈門外代航運(yùn)發(fā)展有限公司招聘船務(wù)部業(yè)務(wù)員1名備考筆試試題及答案解析
- 可再生能源接入熱源廠方案
- CTCT護(hù)理科研與論文寫作
- 2025年夜間經(jīng)濟(jì)五年發(fā)展:智慧創(chuàng)新文旅業(yè)態(tài)與安全管理體系行業(yè)報(bào)告
- 2025重慶某國(guó)企財(cái)務(wù)助理實(shí)習(xí)生崗位招聘2人筆試考試備考試題及答案解析
- 2025中國(guó)醫(yī)學(xué)科學(xué)院醫(yī)學(xué)實(shí)驗(yàn)動(dòng)物研究所第三批招聘3人備考筆試題庫(kù)及答案解析
- 2025年商丘市梁園區(qū)科技中等專業(yè)學(xué)校招聘教師10人參考考試題庫(kù)及答案解析
- 2025重慶建工集團(tuán)股份有限公司招聘1人備考筆試題庫(kù)及答案解析
- 2025福建福州市倉(cāng)山區(qū)殘疾人聯(lián)合會(huì)招聘殘疾人專職聯(lián)絡(luò)員1人模擬筆試試題及答案解析
- 文物保護(hù)學(xué)概論課件ppt 第一章 文物與文物學(xué)
- GB/T 2423.22-2012環(huán)境試驗(yàn)第2部分:試驗(yàn)方法試驗(yàn)N:溫度變化
- 安全教育教案課程全集
- 飼料生產(chǎn)許可證試題
- 建設(shè)工程缺陷責(zé)任期終止證書
- 規(guī)培醫(yī)院教學(xué)查房規(guī)范教案資料
- 護(hù)欄板試驗(yàn)檢測(cè)報(bào)告
- 深基坑邊坡穩(wěn)定性計(jì)算書
- 經(jīng)絡(luò)系統(tǒng)的組成課件
- 小學(xué)校園足球校本課程實(shí)施方案
- 有效輔導(dǎo)與激勵(lì)團(tuán)隊(duì)(課堂PPT)
評(píng)論
0/150
提交評(píng)論