久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

學(xué)習(xí)備忘:Java 中文亂碼解決方案匯總

 昵稱6321289 2011-03-13

原創(chuàng)  學(xué)習(xí)備忘:Java 中文亂碼解決方案匯總 收藏

Java 中文亂碼解決方案 AIO
 
花掉了整整一個(gè)下午, 讀了 sun, ibm, csdn, javaeye 幾個(gè)網(wǎng)站相關(guān)資料共 12 篇, 把 Java 開發(fā)中目前可能遇到的中文亂碼問題及解決方案總結(jié)了一下, 記下備忘.
 
//********************
// 一,、可能出現(xiàn)的亂碼
//********************
1. 包含中文內(nèi)容的 JSP 頁面在瀏覽器中顯示不正確.
2. servlet 無法正確解析 POST 方式提交的中文內(nèi)容.
3. servlet 無法正確解析 GET 方式提交的中文內(nèi)容.
4. servlet 向 response 回送的中文內(nèi)容顯示不正確.
5. 讀/寫數(shù)據(jù)庫時(shí)中文內(nèi)容不正確.
6. 桌面應(yīng)用程序界面中的中文顯示不正確.
以上各種情況下, 凡是涉及顯示的, 中文字符有可能顯示為 ? 或方塊
 

//********************
// 二,、亂碼產(chǎn)生的原因
//********************
  首先, 此問題的根源來自計(jì)算機(jī)字符編碼方式的繁雜和標(biāo)準(zhǔn)的不統(tǒng)一, 由于世界各地語言文字不盡相同, 出現(xiàn)此問題是必然的.
其實(shí), Java 的文件存儲(chǔ)/編譯機(jī)制, JVM 的工作機(jī)制, 在實(shí)現(xiàn)中內(nèi)部都采用了統(tǒng)一的 unicode 編碼方式, 若目標(biāo)平臺(tái)解碼方式不一致, 便會(huì)出現(xiàn)中文亂碼(實(shí)際上不僅是中文, 多/單字符集都有可能出問題, 視目標(biāo)平臺(tái)而不同).
 
  關(guān)于字符集編碼的詳細(xì)分析, 內(nèi)容太多, 不再轉(zhuǎn)述, 在 ibm, unicode.org 等官方網(wǎng)站中, 可以找到幾篇非常深入的資料. 此處只為記錄解決方案.
 
 
//************************
// 三,、避免亂碼的通用原則
//************************
  有一些通用的原則, 在編程中應(yīng)該遵守, 可以免去一些初級(jí)的麻煩:
 
1. JSP:
  a. JSP 文件中, 應(yīng)指定 contentType, 其中 charset 的值要與客戶端瀏覽器所用的字符集一樣.
  b. 對(duì)于其余的字符串常量, 不需做任何內(nèi)碼轉(zhuǎn)換.
  c. 對(duì)于字符串變量, 要能根據(jù) ContentType 中指定的字符集還原成客戶端能識(shí)別的字節(jié)流, 因?yàn)樽址兞渴?"基于 <Jsp-charset> 字符集的".
 
2. Servlet:
  a. Servlet 中, 應(yīng)通過 HttpServletResponse.setContentType() 將 charset 設(shè)置為與客戶端內(nèi)碼一致.
  b. 字符串常量, 需要在 Javac 編譯時(shí)指定 encoding 為與編寫源文件的平臺(tái)的字符集一樣, 對(duì)于中文環(huán)境一般說來都是 GB2312 或 GBK.
  c. 字符串變量, 類似 JSP, 必須是 "基于 <Servlet-charset> 字符集的".
 

//************************************
// 四,、針對(duì)各種亂碼問題的具體解決方案
//************************************
以下解決方案假定目標(biāo)平臺(tái)是中文平臺(tái), 測(cè)試環(huán)境為:
 
操作系統(tǒng) : Windows Vista 版本 6.0 運(yùn)行于 x86 上; GBK; zh_CN (nb), Ubuntu 8.04
瀏覽器  : IE 7, FireFox 3
Java 環(huán)境 : Java 2 SDK 1.6.0_10-rc; Java HotSpot(TM) Client VM 11.0-b15
應(yīng)用服務(wù)器 : Apache Tomcat 6.0
開發(fā)環(huán)境 : NetBeans IDE 6.1

類型1. “包含中文內(nèi)容的 JSP 頁面在瀏覽器中顯示不正確”
-------------------------------------------------
問題描述: 一個(gè) JSP 文件在瀏覽器中打開時(shí), 中文內(nèi)容顯示為 ? 和方塊.
解決方案1: 在 .jsp 文件中指定編碼方式.
示例:
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<META http-equiv=Content-Type content="text/html; charset=UTF-8">
 
說明:
 將編碼方式指定為 UTF-8
 修改后, 中文字符在瀏覽器中顯示正常.

類型2. servlet 無法正確解析 POST 方式提交的中文內(nèi)容(同樣適用于 .jsp 嵌入腳本)..
----------------------------------------------------------------------------
問題描述: 通過 form 以 POST 方式向 servlet 提交數(shù)據(jù)時(shí), servlet 中得到的中文內(nèi)容不正確. (通過測(cè)試可證明, 并非是輸出時(shí)不正確, 而是獲取到的內(nèi)容本身不正確, 問題 3 同).
 
解決方案1: 在 Servlet 中指定編碼方式.
示例:
 在 doPost() 方法中作以下調(diào)用.
 response.setContentType( "text/html; charset=UTF-8" ); // 設(shè)置 content-type
 response.setCharacterEncoding( "UTF-8" );  // 設(shè)置響應(yīng)數(shù)據(jù)編碼格式 (輸出)
 request.setCharacterEncoding( "UTF-8" );  // 設(shè)置請(qǐng)求數(shù)據(jù)編碼格式 (輸入), 此處是關(guān)鍵
說明:
 通常我們會(huì)用 PrintWriter out = response.getWriter(); 來獲取 out 對(duì)象, 如果是這樣, 那此調(diào)用必須放在上述調(diào)用之后.
 之后調(diào)用 request.getParameter() 取到的參數(shù), 不必再作任何轉(zhuǎn)換.
 
解決方案2: 通過 filter 實(shí)現(xiàn)通用編碼過濾.
示例:
 創(chuàng)建一個(gè) filter, 繼承自 HttpServlet, 并實(shí)現(xiàn) Filter 接口.
 在 doFilter() 方法中, 將截獲的 request 內(nèi)容進(jìn)行編碼轉(zhuǎn)換.
 測(cè)試代碼根據(jù) Tomcat 的 filter-example 修改通過, 比較長, 在此不列出了.
 
說明:
 如果項(xiàng)目中涉及編碼轉(zhuǎn)換的模塊較多, 可用此方法.
 此 filter 需實(shí)現(xiàn)一個(gè)繼承自 HttpServletRequestWrapper 的具體類, 可利用 hashmap 結(jié)構(gòu)重載 getParameterValues() 等方法.
 
解決方案3: 編寫單獨(dú)的轉(zhuǎn)換函數(shù)(方法).
說明:
 此方法原理跟方案2一樣, 轉(zhuǎn)換函數(shù)很簡(jiǎn)單, 只需要用 getBytes( "ISO8859-1", "UTF-8" ) 轉(zhuǎn)換即可.
 此方法適用于模塊較少的情況.

類型3. servlet 無法正確解析 GET 方式提交的中文內(nèi)容(同樣適用于 .jsp 嵌入腳本).
--------------------------------------------------------------------------
問題描述: 通過地址欄 URL 以 GET 方式向 servlet 提交數(shù)據(jù)時(shí), servlet 中得到的中文內(nèi)容不正確.
 
解決方案1: 參照類型 2 的解決方案.
說明: GET 方式的這個(gè)問題, 由于跟應(yīng)用服務(wù)器和瀏覽器發(fā)送 URL 的方式相關(guān), 在不同的設(shè)置下, 有可能無效, 可再嘗試下面的方案.
 
解決方案2: 修改 Tomcat 配置.
示例:
 修改 %tomcat_home%\conf\server.xml
 在 <Connector port="8080" protocol="HTTP/1.1"... 段內(nèi)加入 URIEncoding="GBK", 重啟 Tomcat 后生效.
說明:
 此方法經(jīng)測(cè)試有效. 但 server.xml 設(shè)置影響 Tomcat 管理的所有應(yīng)用程序, 如果有別的不同編碼的應(yīng)用存在, 應(yīng)慎用此方法.

類型4. servlet 向 response 回送的中文內(nèi)容顯示不正確.
-------------------------------------------------
參照類型 2 的解決方案1, 設(shè)置正確的 content-type 即可.

類型5. 讀/寫數(shù)據(jù)庫時(shí)中文內(nèi)容不正確.
--------------------------------
不同數(shù)據(jù)庫上的解決方案不同, 但原理相同, 即: 指定數(shù)據(jù)庫使用的字符集, 或在讀/寫時(shí)進(jìn)行編碼轉(zhuǎn)換, 或二者結(jié)合使用.
 
5.1 MySQL:
MySQL 的默認(rèn)編碼為 latin1, 與 ISO8859-1 相同, 涉及中文數(shù)據(jù)時(shí)需要轉(zhuǎn)換.
 
5.1.1.插入中文:(不用編碼)
String sql = "INSERT INTO 表名 (字段名) VALUES('" + request.getParameter( "字段名" ) + "')";
stmt.executeUpdate( sql );
 
5.1.2.顯示讀出的中文:
因?yàn)榇嫒氲氖?Latin1, 顯示需要轉(zhuǎn)換.
String str = new String(( rs.getString( "字段名" )).getBytes( "ISO8859_1" ), "UTF-8" );
out.println( str );
 
5.1.3 直接設(shè)定字符集編碼方式:
Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/jsp?useUnicode=true&characterEncoding=UTF-8", "root", "" );
str = "中文內(nèi)容"; 
String sql = "INSERT INTO 表名 (字段名) VALUES('" + str + "')";
 
5.2 其他數(shù)據(jù)庫 (未經(jīng)測(cè)試, 暫不列出)

6. 桌面應(yīng)用程序界面中的中文顯示不正確.
---------------------------------------
說明:
 任何涉及字符串顯示的地方(常量, 變量), 均應(yīng)考慮到不同編碼的目標(biāo)平臺(tái). 可以將與界面顯示相關(guān)的資源提取出來到放入資源文件 ResourceBundle(ListResourceBundle, PropertyResourceBundle).
 當(dāng)程序需要處理這些資源時(shí), 從 ResourceBundle 里將需要的本地化資源裝入.
 需要注意的是: 為了能夠正確顯示中文字符, 程序里的部件需要選擇指定字體, 例如在顯示中文的時(shí)候使用 "SimSun", 不然界面有中文字符的時(shí)候會(huì)顯示為方框.
 (此節(jié)未經(jīng)測(cè)試)

7. 上傳文件時(shí)的亂碼
--------------------
問題描述: 上傳文件時(shí), 接收到的中文數(shù)據(jù)不正確.
解決方案1: 升級(jí)標(biāo)準(zhǔn)組件.
說明:
 上傳時(shí) form 設(shè)置的都是 enctype="multipart/form-data".
 瀏覽器將以流方式提交文件, 如果使用 apach 的上傳組件, 會(huì)有亂碼情況. 這是因?yàn)?apache 的先期 commons-fileupload.jar 有 bug, 取出漢字后進(jìn)行解碼, 因?yàn)檫@種方式提交, 編碼又自動(dòng)使用的是 Tomcat 缺省編碼格式 ISO8859-1.
 可下載 commons-fileupload-1.1.1.jar (或更新版本) 的 jar, 已經(jīng)解決了這些 bug.
 但是取出內(nèi)容時(shí)仍然需要對(duì)取出的字符進(jìn)行從 ISO8859-1 到 UTF-8 轉(zhuǎn)碼.
 自行編寫的上傳組件, 對(duì)編碼的處理參照上述各點(diǎn).
 

//********************
// 后記
//********************
  經(jīng)過一下午的搜讀和測(cè)試, 發(fā)現(xiàn)原來 java 中亂碼問題非常之多, 以上列出的是今天總結(jié)到的問題和解決, 基本上包括了日常開發(fā)中有可能遇到的情況.
  另外還有幾個(gè)比較少見的亂碼場(chǎng)景, 一是不易遇到, 二是沒有實(shí)際測(cè)試, 故暫時(shí)沒加進(jìn)來, 以后試過若確實(shí)夠典型, 再更新到文檔中.

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多