賈文瀟,葉慧莉(.武昌理工學院信息工程學院,430063;.深圳市云迅通科技股份有限公司研發(fā)部,587)
?
Java Web開發(fā)中的亂碼問題
賈文瀟1,葉慧莉2
(1.武昌理工學院信息工程學院,430063;2.深圳市云迅通科技股份有限公司研發(fā)部,518172)
摘要:在進行Java Web開發(fā)的過程中,采用的編碼與解碼的方式不統(tǒng)一時,就會產生亂碼問題。本文簡要介紹了在J2EE平臺下Java Web開發(fā)中常用的字符編碼方式,并分析中文亂碼產生的原因,并在此基礎上針對常見的幾種中文亂碼問題給出相應的解決方案,使開發(fā)人員可以更方便的解決亂碼問題。
關鍵詞:中文亂碼;Java Web 開發(fā);字符編碼
經過多年發(fā)展,Java技術已經成為了最卓越的應用開發(fā)平臺,在移動互聯(lián)網、網絡計算等領域取得了成功的應用。在Java Web應用開發(fā)中,頁面中顯示的中文經常出現亂碼情況,其原因就是組件與組件、組件與瀏覽器、組件與數據庫之間等采用的編碼方式不同,所以在應用程序運行的過程中,汪汪要經過多次字符編碼之間的轉換才能正常的顯示,而在轉換的過程中一旦設置錯誤就會導致中文亂碼。本文從Java Web常見的編碼和運行原理出發(fā),詳細介紹了Java Web開發(fā)過程中常見的中文亂碼問題以及解決方案。
1.1 ISO8859-1
ISO8859-1編碼屬于單字節(jié)編碼,是國際標準化組織內ISO/ IEC 8859的第一個8位字符集,最多能夠表示的字符范圍是0-255,應用于英文系列,是Java網絡傳輸中使用的標準字符集。
1.2 UTF-8
UTF-8編碼可以兼容ISO8859-1編碼和Unicode編碼,用1 到6個字節(jié)不等編碼Unicode字符。同時UTF-8編碼帶有簡單的校驗功能,一般來說,用在網頁上可以在同一頁面顯示中文簡體繁體及其他語言。
1.3 Unicode
Unicode屬于統(tǒng)一的字符編碼標準集,可以用來表示所用語言的字符,使用2個字節(jié)或4個字節(jié)對每一個字符進行編碼,但是該編碼并不兼容ISO8859-1編碼,可以實現跨語言、跨平臺的文本轉換以及處理要求,是Java語言默認的字符集。
1.4 GB2312/GBK
GB2312和GBK是國國家標準漢字信息交換用編碼,專門用來表示漢子,簡稱國標碼,屬于雙字節(jié)編碼。其中GBK是對GB2312的擴充,能夠用來同時表示繁體字和簡體字,而GB2312只能夠表示簡體字。
為了讓Java編寫的程序能夠在不同的語言平臺運行,Java在其語言內部使用了統(tǒng)一的Unicode字符集來表示字符。Java源程序是先根據操作系統(tǒng)默認的編碼方式來完成轉碼,并通過I/O操作得到相應的編碼字節(jié)流,將其轉換成UTF-8編碼寫入Class文件中。
當操作文件是簡體中文時默認的編碼格式是GBK,編譯時采用GBK方式轉化成Unicode,在轉化成UTF-8寫入到Class文件中。在原系統(tǒng)中不會出現亂碼現象,但是一旦移動到英文系統(tǒng)中很可能出現中文亂碼的現象,其原因就是Java采用UTF-8讀取Class文件,再將Class文件轉化為Unicode,在編碼轉換的過程中,都是通過Unicode編碼來作為中介來完成的,這時造成亂碼的主要原因是使用了錯誤的字符集解碼字節(jié)流或將給定的字節(jié)流用錯誤的字符集解碼。
3.1 頁面顯示亂碼
在訪問JSP頁面或Servlet產生的頁面時,如果頁面上本該顯示中文的地方顯示為亂碼,這可能是瀏覽器的顯示不正確,也可能是后臺在生成界面時其內容就是亂碼。如果是瀏覽器問題就需要設置JSP或Servlet的屬性,在對JSP設置使用page指令時,其設置如下:
〈% @ p a g e c o n t e n t T y p e =”t e x t / html”;charset=”GB2312”〉
而對于Servlet生成頁面,在輸出頁面前調用
setContentType()方法,代碼如下:
r e s p o n s e . s e t C o n t e n t T y p e (“t e x t / html;charset=GB2312”)。
3.2 用戶提交數據亂碼
用戶數據提交有Post和Get兩種方法。
(1)采用get方式提交顯示亂碼及解決方案
采用get或參數方式提交數據,數據是附加在URL中,默認采用ISO-8859-1的編碼方式編碼,此時在JSP中設置的charset無效,為了解決這種情況下的亂碼,要在servlet
中添加代碼:
String str=new String(request.getParameter("參數名").getBytes("ISO-8859-1"),"utf-8")。
(2)采用post方式提交顯示亂碼及解決方案
采用post提交方式,提交的數據是通過Http的實體內容發(fā)送給服務器的,數據根據瀏覽器的charset編碼方式進行編碼,服務器在接收的時候也需要對request設置正確的解碼方式,設置的解碼方式不一致就會出現亂碼。
3.3 數據庫中數據亂碼
在JSP/Servlet與數據庫進行交互時,如果JSP/Servletz、傳輸通道、數據庫采用的編碼字符集不一致就會產生亂碼問題。要解決這一問題,首先確保JSP/Servlet采用的是GBK編碼,確保數據庫中的中文數據正常;其次確保數據庫采用GBK編碼,對于MySQL而言可以使用其配置向導設置數據庫采用GBK編碼作為默認集;最后連接MySQL數據庫的連接對象上設置字符集為GBK編碼,如下:
jdbc:mysql://localhost:3306/db1user=root&password= 123456&useUnicode=true&characterEncoding=GBK為連接字符串URL,其中characterEncoding=GBK是關鍵代碼,表示連接對象采用GBK編碼字符集。
本文從Java Web應用開發(fā)的字符編碼理論出發(fā),介紹常用的字符編碼,并分析出現亂碼的原因,并給出了詳細的解決方法。綜上所述,在Java Web應用開發(fā)中,處理亂碼問題,首先要抓住亂碼的根源,按照顯示界面、接收數據、保存數據、讀取數據和將數據顯示給用戶的順序,逐步查找出問題的那一步,并采取相應的方法。
參考文獻
[1]王子君,范學蜂,張志浩. Java編碼問題研究與應用[J].計算機工程, 2002
[2]王進.基于JSP的Web開發(fā)中文亂碼問題研究[J].信息系統(tǒng)工程,2012
[3]劉永立.Java環(huán)境下Web程序的中文亂碼問題與對策[J].電腦編程技巧與維護,2011
[4]孫鑫.Java Web開發(fā)詳解[M].北京:電子工業(yè)出版社,2007 [5]李響,郝靜靜.Java Web開發(fā)中文亂碼問題的研究與解決[J].電腦知識與技術,2012
The garbage problem in the development of Web Java
Jia Wenxiao1,Ye Huili2
(1.Wuchang University of Technology Information and Engineering School,430063 2.Shenzhen cloud fast through Polytron Technologies Inc R & D department,518172)
Abstract:In Java Web development process, the use of the encoding and decoding way is not unified,will generate the code.This paper briefly introduces the J2EE platform is commonly used in Java Web development way of character encoding,and analyzes the causes of Chinese garbled,on the basis of several common Chinese garbled question for given corresponding solutions,the developer can more easily solve the problem of gibberish.
Keywords:Chinese garbled;Java Web development;A character encoding