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