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

付費下載

下載本文檔

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

文檔簡介

1、對Java中Unicode、編碼的理解Java號稱國際化的語言,是因為它的class文件采用UTF-8,而JVM運行時使用UTF-16。因此java用的都是Unicode。unicode 的目標就是能支持世界上所有的字符集,也就是說幾乎所有的字符集包含的字符在unicode中都有對應(yīng)的編碼。在unicode中,字符與代碼的映射關(guān) 系,就是unicode字符集,稱為UCS(Unicode Character Set),每個unicode字符編碼稱為code point(代碼點?)。UTF-8和UTF-16是不同的UCS編碼方法,UTF就是UCS Transformation Format。;在J

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

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

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

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

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

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

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

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

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

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

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

13、碼格式進行編碼。所以自動編碼為utf-8,接受頁面正常接受就可以了。但我認為真正的編碼過程是,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īng)編碼為utf-8,再編碼也不會有變化了。如果是從url獲取編碼,接受頁面則是根據(jù)URIEncoding=”UTF-8”來進行解碼的。上傳文件時的亂碼解決上傳文件時,form表單設(shè)置的都是enctype="multipart/form-data"。這種方式以流方式提交

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

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

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

溫馨提示

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

評論

0/150

提交評論