摘? 要:Java Web網(wǎng)站開發(fā)中經(jīng)常出現(xiàn)中文亂碼問題,初學(xué)者在解決此類問題時(shí)非常耗費(fèi)時(shí)間。以eclipse開發(fā)環(huán)境為例,針對初學(xué)者在Java Web開發(fā)中經(jīng)常出現(xiàn)的字符編碼問題,分別從常見字符編碼種類、設(shè)定方式、不同頁面類型代碼編寫差異方面進(jìn)行總結(jié),并對常見中文亂碼產(chǎn)生原因進(jìn)行分析并給出相應(yīng)的解決方案,為解決中文亂碼問題提供相應(yīng)的思路。
關(guān)鍵詞:Java Web;字符編碼;中文亂碼;eclipse
中圖分類號:TP311? ? ? ?文獻(xiàn)標(biāo)識碼:A 文章編號:2096-4706(2020)01-0074-03
Abstract:In the development of Java Web,the problem of Chinese messy code is often occered,which is very time consuming. Taking the eclipse development environment as an example,aiming at the character coding problems that often appear in the Java Web development for beginners,this paper summarizes the common types of character coding,setting methods,and the differences in code writing of different page types,and analyzes the causes of common Chinese character scrambling and gives the corresponding solutions,so as to provide the corresponding ideas for solving the problem of Chinese character scrambling.
Keywords:Java Web;character encoding;Chinese messy code;eclipse
0? 引? 言
Java語言是一種面向?qū)ο蟮恼Z言,它具有平臺無關(guān)性、較好的安全性、簡單易用等優(yōu)點(diǎn),基于Java語言的Web開發(fā)越來越受到廣大編程愛好者的青睞。在Java Web應(yīng)用程序中有多種類型的頁面構(gòu)成,如HTML、JSP、Servlet等,而不同的頁面類型在字符編碼設(shè)定方式有所差異,初學(xué)者易混淆它們之間的區(qū)別,導(dǎo)致開發(fā)中出現(xiàn)中文亂碼問題。接下來,從常見的字符編碼方式、設(shè)定方式、不同頁面代碼編寫區(qū)別方面分別進(jìn)行介紹。
1? 幾種常見的字符編碼方式
計(jì)算機(jī)采用二進(jìn)制進(jìn)行信息存儲,任何語言在計(jì)算機(jī)存儲時(shí)必須進(jìn)行編碼。在Java Web開發(fā)中,JSP和Java是基于字節(jié)流的,也就是通用字符集Unicode,使其具有良好的跨平臺性,但其在編譯成class文件或Servlet文件,或是與其他類型文件進(jìn)行交互時(shí)必存在轉(zhuǎn)碼,轉(zhuǎn)碼期間的編碼或解碼不正確必產(chǎn)生亂碼,以下是常用的字符編碼方式:
(1)Unicode編碼。Unicode基于通用字符集,它為每種語言中的每個(gè)字符都設(shè)定了統(tǒng)一并且唯一的二進(jìn)制編碼,能實(shí)現(xiàn)跨平臺、跨語言的轉(zhuǎn)換,Java語言內(nèi)部即使用2個(gè)字節(jié)的Unicode編碼。
(2)GBK編碼。GBK是在國家標(biāo)準(zhǔn)GB 2312基礎(chǔ)上擴(kuò)容后兼容GB 2312的標(biāo)準(zhǔn),其采用雙字節(jié)編碼,用于解決漢字編碼問題而提出,能夠顯示所有的漢字。
(3)UTF-8編碼。UTF-8是用1到4個(gè)字節(jié)編碼的Unicode字符,用以解決國際上不同國家標(biāo)準(zhǔn)導(dǎo)致的一個(gè)代碼值對應(yīng)不同字母的問題,UTF-8是一種多字節(jié)編碼,它對英文使用8位(即1個(gè)字節(jié)),中文使用24位(3個(gè)字節(jié))來編碼。
(4)ISO-8859-1編碼,又稱Latin1。該編碼向下兼容ASCII,常用于歐洲國家,因其采用的是8位的單字節(jié)編碼,其在支持ISO-8859-1的系統(tǒng)中傳輸和存儲其他任何編碼的字節(jié)流都不會被拋棄,因此很多協(xié)議都采用這種編碼方式,例如MySQL和eclipse默認(rèn)是這種編碼方式。但是,它表示的字符范圍很窄,無法表示中文字符。
2? 字符編碼設(shè)定方式
2.1? eclipse開發(fā)環(huán)境字符編碼設(shè)置方式
eclipse因其免費(fèi)且使用方便成為廣大Java Web開發(fā)者的首選,使用eclipse開發(fā)應(yīng)用程序時(shí),為了避免出現(xiàn)中文亂碼問題,可以設(shè)置頁面的默認(rèn)編碼方式為UTF-8,主要設(shè)置3個(gè)位置,一是設(shè)置工作空間編碼,通過Windows-Preferences-Workspace-Text file encoding進(jìn)行設(shè)置;二是設(shè)置HTML頁面編碼,通過Windows-Preferences-Web-HTML Files-Encoding設(shè)置;三是設(shè)置JSP頁面編碼,通過Windows-Preferences-Web-JSP Files-Encoding進(jìn)行設(shè)置。
2.2? 通過代碼編寫設(shè)定字符編碼方式
在Java Web代碼編寫中,一般有兩種設(shè)定字符編碼的方式,一是通過Content-Type(內(nèi)容類型)屬性設(shè)定字符編碼。Content-Type是響應(yīng)的HTTP內(nèi)容類型,又稱為MIME類型。MIME類型為瀏覽器呈現(xiàn)網(wǎng)頁時(shí)使用的編碼格式,用于告知瀏覽器要接收的數(shù)據(jù)是什么類型,這樣瀏覽器才能知道如何顯示這些數(shù)據(jù);二是通過pageEncoding屬性設(shè)定字符編碼方式。該屬性一般作為page指令的屬性,該屬性用于定義JSP頁面的編碼格式,JSP頁面中所有代碼都使用該屬性指定的字符集,如果該屬性值設(shè)定為ISO-8859-1,那么這個(gè)JSP頁面就不支持中文字符。
2.3? 通過配置文件設(shè)定字符編碼方式
HTTP協(xié)議請求方法采用GET時(shí),因其傳遞參數(shù)的字符編碼方式為ISO-8859-1,而解碼是UTF-8或GBK,兩者不一致導(dǎo)致的中文亂碼問題,可通過修改Tomcat服務(wù)器的配置文件server.xml中的
3? 不同頁面類型代碼編寫差異
3.1? HTML頁面
HTML頁面如果未指定Content-Type,默認(rèn)為text/HTML,
所以,在HTML中有兩種代碼表示形式,分別為
3.2? JSP頁面
JSP一般通過page指令設(shè)定字符編碼方式,如<%@ page language="java" contentType="text/html;charset= UTF-8"? pageEncoding="UTF-8"%>,其中,pageEncoding和contentType均能設(shè)定編碼格式,但是兩者優(yōu)先級、作用域不同,設(shè)定JSP源文件字符集時(shí),優(yōu)先級為pageEncoding>contentType。如果都沒有設(shè)定,默認(rèn)ISO-8859-1。設(shè)定響應(yīng)輸出的字符集時(shí),優(yōu)先級為contentType>pageEncoding。如果都沒有設(shè)定,默認(rèn)ISO-8859-1。一個(gè)JSP的源文件需要經(jīng)過三個(gè)階段,兩次編碼,才能完成一次完整的輸出:第一階段,通過pageEncoding設(shè)定的編碼方式將JSP編譯成Servlet(.java)文件;第二階段,由Javac的Java源碼至Java ByteCode的編譯,也就是從UTF-8到UTF-8;第三階段,按照Content-Type設(shè)定的編碼方式將內(nèi)容輸出到瀏覽器。
3.3? Servlet頁面
對于Servlet接收到的請求和處理后的響應(yīng),無法通過指令或是內(nèi)置對象設(shè)定編碼方式,可通過請求接口HttpServlet Request和響應(yīng)接口HttpServletResponse傳遞的對象參數(shù)設(shè)定編碼方式,如request.setCharacterEncoding("UTF-8")用于設(shè)定請求體的編碼方式為UTF-8,response.setContentType("text/html;charset=UTF-8")用于設(shè)定響應(yīng)體的編碼方式,需要注意的是兩種設(shè)定方法只能在response.getWriter();之前使用才有作用。
4? 幾種導(dǎo)致中文亂碼的原因及解決方法
4.1? HTML頁面訪問出現(xiàn)亂碼
在HTML中,編碼方式已經(jīng)設(shè)置為UTF-8或GB2312(GBK),仍然會出現(xiàn)亂碼。在HTML文件中,頭部的"content-type"中設(shè)定的"charset"是告知瀏覽器打開該文件的編碼方式,實(shí)際上,HTML文件是有編碼格式的,也就是存儲時(shí)的編碼方式,只有兩者一致才不會導(dǎo)致中文亂碼,在用記事本存儲HTML文件時(shí)可以選擇存儲時(shí)編碼方式,而eclipse可通過Windows下的properties修改HTML的默認(rèn)存儲時(shí)編碼方式。
4.2? JSP頁面訪問出現(xiàn)亂碼
在JSP頁面中,頁面的pageEncoding和Content-Type屬性均設(shè)置為UTF-8,在頁面?zhèn)鬟f參數(shù)過程中仍出現(xiàn)中文亂碼問題,導(dǎo)致此問題的原因?yàn)檎埱蠓椒ǖ氖褂脝栴},GET和POST是HTTP協(xié)議中最常用的兩種請求方法,用GET發(fā)送的數(shù)據(jù)會追加到URL后面,而POST發(fā)送的數(shù)據(jù)是放在請求體內(nèi)。通過page指令設(shè)定的字符編碼方式作用于整個(gè)JSP頁面,對請求頭部信息有效,但不能作用于請求體部分,所以用GET方法發(fā)送的請求可正常顯示,而用POST方法發(fā)送的請求會出現(xiàn)中文亂碼,該種情況可通過使用request內(nèi)置對象設(shè)定編碼,如request.setCharacterEncoding("UTF-8")。
4.3? Servlet頁面訪問出現(xiàn)亂碼
由于瀏覽器默認(rèn)使用UTF-8進(jìn)行編碼,而Servlet使用ISO-8859-1進(jìn)行編碼,傳輸和接收方編碼不一致會導(dǎo)致中文亂碼的產(chǎn)生。對于請求的數(shù)據(jù)存在中文的情況,可通過request.setCharacterEncoding("UTF-8")進(jìn)行編碼設(shè)置,對于響應(yīng)的數(shù)據(jù)存在中文的情況可通過response.setContentType("text/html;charset=UTF-8")進(jìn)行設(shè)置,但是,該設(shè)置必須在獲得到輸出流之前完成。另一種思路是通過Servlet過濾器解決整個(gè)應(yīng)用的中文亂碼問題,通過配置web.xml,指定字符編碼類型和過濾器關(guān)聯(lián)的URL,實(shí)現(xiàn)過濾器對Servlet請求和響應(yīng)的字符編碼的自動檢查和處理。
4.4? 數(shù)據(jù)庫訪問出現(xiàn)亂碼
MySQL中中文數(shù)據(jù)正常顯示,但Java Web訪問數(shù)據(jù)庫出現(xiàn)亂碼。Java Web訪問數(shù)據(jù)庫是通過客戶端JDBC驅(qū)動來完成的,用JDBC來存取數(shù)據(jù)要和數(shù)據(jù)的內(nèi)置編碼保持一致,如果MySQL中編碼方式為GBK,而Servlet或JSP為UTF-8,會因編碼與解碼不一致導(dǎo)致亂碼,可以在JDBC的數(shù)據(jù)庫訪問URL后增加設(shè)置字符編碼的參數(shù)解決:url="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8"。
5? 結(jié)? 論
Java Web程序開發(fā)中出現(xiàn)字符亂碼的情況很多,其根本原因是字符傳遞過程中編碼不一致。解決亂碼的根本方法是統(tǒng)一編碼,先從運(yùn)行環(huán)境、服務(wù)器、瀏覽器等外圍統(tǒng)一編碼,然后到編程語言內(nèi)部統(tǒng)一控制,逐步查找問題,并采取相應(yīng)方法。Java Web技術(shù)應(yīng)用廣泛,其與多種開發(fā)技術(shù)結(jié)合使用期間會出現(xiàn)亂碼問題,程序人員應(yīng)當(dāng)根據(jù)出現(xiàn)亂碼的位置及特點(diǎn)細(xì)致分析,提出解決辦法。
參考文獻(xiàn):
[1] 張學(xué)誠.Java WEB開發(fā)中的中文亂碼問題解決方法 [J].電腦知識與技術(shù),2018,14(27):62-63.
[2] 王衛(wèi),李天琦,湯偉,等.基于JSP技術(shù)項(xiàng)目開發(fā)中中文亂碼問題研究 [J].電腦編程技巧與維護(hù),2018(8):38-39+61.
[3] 賈曉芳,沈澤剛.Java Web應(yīng)用開發(fā)中的常見亂碼形式及解決方法 [J].軟件導(dǎo)刊,2017,16(4):214-216.
[4] 任憲臻,梁宏英.JSP頁面中文亂碼解決方法 [J].數(shù)字技術(shù)與應(yīng)用,2017(1):154+157.
[5] 張劍.基于JSP技術(shù)的中文亂碼原因分析及對策研究 [J].山西電子技術(shù),2016(6):75-76.
[6] 趙璞.Java Web程序開發(fā)中字符亂碼的原因與解決辦法 [J].電腦編程技巧與維護(hù),2016(20):24+27.
[7] 馮中毅,董海棠,岳建斌,等.Java Web開發(fā)中的亂碼問題分析及解決方案研究 [J].科技信息,2013(19):92+101.
[8] 張健.基于java web中文亂碼問題的研究 [J].電子世界,2014(18):371.
作者簡介:耿學(xué)(1986-),女,漢族,山東高青人,助教,畢業(yè)于太原理工大學(xué),碩士研究生,研究方向:軟件開發(fā)。