jsp編碼問(wèn)題new_第1頁(yè)
jsp編碼問(wèn)題new_第2頁(yè)
jsp編碼問(wèn)題new_第3頁(yè)
jsp編碼問(wèn)題new_第4頁(yè)
jsp編碼問(wèn)題new_第5頁(yè)
已閱讀5頁(yè),還剩1頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、對(duì)Java中Unicode、編碼的理解Java號(hào)稱(chēng)國(guó)際化的語(yǔ)言,是因?yàn)樗腸lass文件采用UTF-8,而JVM運(yùn)行時(shí)使用UTF-16。因此java用的都是Unicode。unicode 的目標(biāo)就是能支持世界上所有的字符集,也就是說(shuō)幾乎所有的字符集包含的字符在unicode中都有對(duì)應(yīng)的編碼。在unicode中,字符與代碼的映射關(guān) 系,就是unicode字符集,稱(chēng)為UCS(Unicode Character Set),每個(gè)unicode字符編碼稱(chēng)為code point(代碼點(diǎn)?)。UTF-8和UTF-16是不同的UCS編碼方法,UTF就是UCS Transformation Format。;在J

2、ava 中,String的getBytes()方法就是對(duì)特定的字符串(unicode)按照給定的字符集進(jìn)行編碼(encode),new String()則可以按照某個(gè)字符集將字節(jié)流轉(zhuǎn)換回unicode(decode)。Java里面的每一個(gè)String都是unicode編碼。再來(lái)看頁(yè)面,如果不做特殊處理,F(xiàn)orm的提交就按照頁(yè)面的ContentType設(shè)置中的字符集進(jìn)行編碼轉(zhuǎn)換,發(fā)送到后臺(tái),后臺(tái)必須利用req.setCharacterEncoding來(lái)指定參數(shù)的編碼格式(不同的應(yīng)用服務(wù)器應(yīng)有不同的指定方式),才能正確解碼。Java 里面的encode和decode都是相對(duì)于unicode而言的,

3、encode的意思是將char -> XXX Encoding byte,decode就是由XXX Encoding byte -> char。平常,當(dāng)我們說(shuō)“將GBK編碼轉(zhuǎn)換為UTF-8編碼”的時(shí)候,實(shí)際的意思就是:GBK Encoding byte -> UTF-8 Encoding byte,這種轉(zhuǎn)換只有在需要用byte傳輸數(shù)據(jù)的時(shí)候才有意義,否則便是毫無(wú)意義的。首先要說(shuō)明的一點(diǎn)是:Java中的String對(duì)象就是一個(gè)unicode編碼的字符串。但是,我們通常會(huì)聽(tīng)到有人說(shuō):“我們需要將String由ISO-8859-1轉(zhuǎn)換為GBK編碼”,這又是怎么回事呢?實(shí)際上,我們并

4、不是要“將 一個(gè)由ISO-8859-1編碼的String轉(zhuǎn)換為GBK編碼的String”,反復(fù)說(shuō)明的是,JAVA中的String都是unicode編碼的,所以不存在“ISO- 8859-1編碼的String”或“GBK編碼的String”這樣的說(shuō)法。而需要轉(zhuǎn)換的唯一的原因是String進(jìn)行了錯(cuò)誤的編碼。我們經(jīng)常會(huì)碰到由ISO-8859- 1轉(zhuǎn)換為諸如GBK/UTF-8等等這樣的需求。所謂的轉(zhuǎn)換過(guò)程是:String -> byte ->String。也許 你非常清楚這個(gè)過(guò)程的代碼:new String(text.getBytes("ISO-8859-1"),&qu

5、ot;GBK")。但是,要真正理解起來(lái)并不是那么簡(jiǎn)單。表面上看似乎很容易理解, 不就是將text String對(duì)象按照ISO-8859-1的方式編碼為byte然后再把它按照GBK的方式轉(zhuǎn)換為String嗎?但是這句代碼很容易會(huì)被誤解為: “將text String由ISO-8859-1轉(zhuǎn)換為GBK編碼”,這種說(shuō)法是錯(cuò)誤的。難道你見(jiàn)過(guò)用這樣的代碼:new String(text.getBytes("GBK"),"UTF-8")來(lái)對(duì)String進(jìn)行編碼轉(zhuǎn)換的嗎?之所以你會(huì)經(jīng)??吹絥ew String(text.getBytes("ISO-

6、8859-1"),"GBK")這句代碼,是因?yàn)橐粋€(gè)GBK的字節(jié)流被錯(cuò)誤地以ISO-8859- 1的方式轉(zhuǎn)換為String(unicode)了!發(fā)生這種情況最普遍的地方是一個(gè)GBK編碼的網(wǎng)頁(yè)向后臺(tái)提交數(shù)據(jù)的時(shí)候,就有可能會(huì)看到這句代碼的出 現(xiàn)。GBK的流被錯(cuò)誤的當(dāng)成ISO8859-1的流,所以便得到了一個(gè)錯(cuò)誤的String。由于ISO8859-1是單字節(jié)編碼,所以每個(gè)字節(jié)被按照原樣 轉(zhuǎn)換為String,也就是說(shuō),雖然這是一個(gè)錯(cuò)誤的轉(zhuǎn)換,但編碼沒(méi)有改變,所以我們?nèi)匀挥袡C(jī)會(huì)把編碼轉(zhuǎn)換回來(lái)!所以那句經(jīng)典的new String(text.getBytes("ISO

7、-8859-1"),"GBK")便出現(xiàn)了。如果系統(tǒng)誤以為是其它編碼格式,就有可能再也轉(zhuǎn)換不回來(lái)了,因?yàn)榫幋a轉(zhuǎn)換并不是負(fù)負(fù)得正那么簡(jiǎn)單的% page language="java" pageEncoding="UTF-8"% page contentType="text/html;charset=iso8859-1"%htmlheadtitle中文問(wèn)題/titlemeta http-equiv="Content-Type" content="text/html; charset

8、=UTF-8"/head/headbody這就是一行中文/body/html 三個(gè)地方的編碼第一個(gè)地方的編碼格式為jsp文件的存儲(chǔ)格式。Ecljpse會(huì)根據(jù)這個(gè)編碼格式保存文件。并編譯jsp文件,包括里面的漢字。第二處編碼為解碼格式。因?yàn)榇鏋閁TF-8的文件被解碼為iso8859-1,這樣如有中文肯定出亂碼。也就是必須一致。而第二處所在的這一行,可以沒(méi)有。缺省也是使用iso8859-1的編碼格式。所以如果沒(méi)有這一行的話(huà),“這就是一行中文”也會(huì)出現(xiàn)亂碼。必須一致才可以。(好像有些版本的Tomcat設(shè)置了第一個(gè)第二行不用也可以的,大家可以自己試下自己版本是不這樣的)第三處編碼為控制瀏覽器

9、的解碼方式。如果前面的解碼都一致并且無(wú)誤的話(huà),這個(gè)編碼格式?jīng)]有關(guān)系。有的網(wǎng)頁(yè)出現(xiàn)亂碼,就是因?yàn)闉g覽器不能確定使用哪種編碼格式。因?yàn)轫?yè)面有時(shí)候會(huì)嵌入頁(yè)面,導(dǎo)致瀏覽器混淆了編碼格式。出現(xiàn)了亂碼。表單使用Post方式提交后接收到的亂碼問(wèn)題這個(gè)問(wèn)題也是一個(gè)常見(jiàn)的問(wèn)題。這個(gè)亂碼也是tomcat的內(nèi)部編碼格式iso8859-1在搗亂,也就是說(shuō)post提交時(shí),如果沒(méi)有設(shè)置提交的編碼格式,則會(huì)以iso8859-1方式進(jìn)行提交,接受的jsp卻以u(píng)tf-8的方式接受。導(dǎo)致亂碼。既然這樣的原因,下面有幾種解決方式,并比較。a. 接受參數(shù)時(shí)進(jìn)行編碼轉(zhuǎn)換String str = new String(request.g

10、etParameter("something").getBytes("ISO-8859-1"),"utf-8") ; 這樣的話(huà),每一個(gè)參數(shù)都必須這樣進(jìn)行轉(zhuǎn)碼。很麻煩。但確實(shí)可以拿到漢字。b. 在請(qǐng)求頁(yè)面上開(kāi)始處,執(zhí)行請(qǐng)求的編碼代碼request.setCharacterEncoding("UTF-8") 把提交內(nèi)容的字符集設(shè)為UTF8。這樣的話(huà),接受此參數(shù)的頁(yè)面就不必在轉(zhuǎn)碼了。直接使用String str = request.getParameter("something"); 即可得到漢字參數(shù)

11、。但每頁(yè)都需要執(zhí)行這句話(huà)。這個(gè)方法也就對(duì)post提交的有效果,對(duì)于get提交和上傳文件時(shí)的enctype="multipart/form-data"是無(wú)效的。稍后下面單獨(dú)對(duì)這個(gè)兩個(gè)的亂碼情況再進(jìn)行說(shuō)明。c. 為了避免每頁(yè)都要寫(xiě)request.setCharacterEncoding("UTF-8"),建議使用過(guò)濾器對(duì)所有jsp進(jìn)行編碼處理。這個(gè)網(wǎng)上有很多例子。請(qǐng)大家自己查閱。表單get提交方式的亂碼處理方式如果使用get方式提交中文,接受參數(shù)的頁(yè)面也會(huì)出現(xiàn)亂碼,這個(gè)亂碼的原因也是tomcat的內(nèi)部編碼格式iso8859-1導(dǎo)致。Tomcat會(huì)以get的缺

12、省編碼方式iso8859-1對(duì)漢字進(jìn)行編碼,編碼后追加到url,導(dǎo)致接受頁(yè)面得到的參數(shù)為亂碼/、。解決辦法:a. 使用上例中的第一種方式,對(duì)接受到的字符進(jìn)行解碼,再轉(zhuǎn)碼。b. Get走的是url提交,而在進(jìn)入url之前已經(jīng)進(jìn)行了iso8859-1的編碼處理。要想影響這個(gè)編碼則需要在server.xml的Connector節(jié)點(diǎn)增加useBodyEncodingForURI="true"屬性配置,即可控制tomcat對(duì)get方式的漢字編碼方式,上面這個(gè)屬性控制get提交也是用request.setCharacterEncoding("UTF-8")所設(shè)置的編

13、碼格式進(jìn)行編碼。所以自動(dòng)編碼為utf-8,接受頁(yè)面正常接受就可以了。但我認(rèn)為真正的編碼過(guò)程是,tomcat又要根據(jù)Connector port="8080"maxThreads="150" minSpareThreads="25" maxSpareThreads="75"enableLookups="false" redirectPort="8443" acceptCount="100"debug="0" connectionTimeo

14、ut="20000" useBodyEncodingForURI="true"disableUploadTimeout="true" URIEncoding=”UTF-8”/ 里面所設(shè)置的URIEncoding=”UTF-8”再進(jìn)行一次編碼,但是由于已經(jīng)編碼為utf-8,再編碼也不會(huì)有變化了。如果是從url獲取編碼,接受頁(yè)面則是根據(jù)URIEncoding=”UTF-8”來(lái)進(jìn)行解碼的。上傳文件時(shí)的亂碼解決上傳文件時(shí),form表單設(shè)置的都是enctype="multipart/form-data"。這種方式以流方式提交

15、文件。如果使用apach的上傳組件,會(huì)發(fā)現(xiàn)有很多亂碼想象。這是因?yàn)閍pach的先期commons-fileupload.jar有bug,取出漢字后進(jìn)行解碼,因?yàn)檫@種方式提交,編碼又自動(dòng)使用的是tomcat缺省編碼格式iso-8859-1。但出現(xiàn)的亂碼問(wèn)題是:句號(hào),逗號(hào),等特殊符號(hào)變成了亂碼,漢字如果數(shù)量為奇數(shù),則會(huì)出現(xiàn)亂碼,偶數(shù)則解析正常。解決方式:下載commons-fileupload-1.1.1.jar 這個(gè)版本的jar已經(jīng)解決了這些bug。但是取出內(nèi)容時(shí)仍然需要對(duì)取出的字符進(jìn)行從iso8859-1到utf-8轉(zhuǎn)碼。已經(jīng)能得到正常所有漢字以及字符。Java代碼關(guān)于url請(qǐng)求,接受參數(shù)的亂

16、碼url的編碼格式,取決于上面所說(shuō)的URIEncoding=”UTF-8”。如果設(shè)定了這個(gè)編碼格式,則意味著所有到url的漢字參數(shù),都必須進(jìn)行編碼才可以。否則得到的漢字參數(shù)值都是亂碼,例如一個(gè)鏈接:Response.sendDerect(“/a.jsp?name=張大維”); 而在a.jsp里面直接使用String name = request.getParameter("name"); 得到的就是亂碼。因?yàn)橐?guī)定了必須是utf-8才可以,所以,這個(gè)轉(zhuǎn)向應(yīng)該這樣寫(xiě):Response.sendDerect(“/a.jsp?name=URLEncode.encode(“張大維”,

17、”utf-8”); 才可以。如果不設(shè)置這個(gè)參數(shù)URIEncoding=”UTF-8”,會(huì)怎么樣呢? 不設(shè)置則就使用了缺省的編碼格式iso8859-1。問(wèn)題又出來(lái)了,第一就是參數(shù)值的個(gè)數(shù)如果是奇數(shù)個(gè)數(shù),則就可以正常解析,如果使偶數(shù)個(gè)數(shù),得到最后字符就是亂碼。還有就是如果最后一個(gè)字符如果是英文,則就能正常解析,但中文的標(biāo)點(diǎn)符號(hào)仍出現(xiàn)亂碼。權(quán)宜之計(jì),如果您的參數(shù)中沒(méi)有中文標(biāo)點(diǎn)符號(hào),則可以在參數(shù)值最后加一個(gè)英文符號(hào)來(lái)解決亂碼問(wèn)題,得到參數(shù)后再去掉這個(gè)最后面的符號(hào)。也可以湊或使用。腳本代碼關(guān)于url請(qǐng)求,接受到的參數(shù)亂碼腳本中也會(huì)進(jìn)行頁(yè)面轉(zhuǎn)向的控制,也會(huì)涉及到附帶參數(shù),并在接受頁(yè)面解析這個(gè)參數(shù)的情況。如果這個(gè)漢字參數(shù)不進(jìn)行URIEncoding=”UTF-8”所指定的編碼處理,則接受頁(yè)面接受到的漢字也是亂碼。腳本處理編碼比較麻煩,必須有相應(yīng)的編碼腳本對(duì)應(yīng)文件,然后調(diào)用腳本中的方法對(duì)漢字進(jìn)行編碼即可。關(guān)于jsp在MyEclipse中打開(kāi)的亂碼問(wèn)題對(duì)于一個(gè)已經(jīng)存在的項(xiàng)目,Jsp文件的存儲(chǔ)格式可能是utf-8。如果

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論