1. 程式人生 > >JSP中文亂碼處理

JSP中文亂碼處理

自從接觸Java和JSP以來,就不斷與Java的中文亂碼問題打交道,現在終於得到了徹底的解決,現將我們的解決心得與大家共享。

  一、Java中文問題的由來

  Java的核心和class檔案是基於unicode的,這使Java程式具有良好的跨平臺性,但也帶來了一些中文亂碼問題的麻煩。原因主要有兩方面,Java和JSP檔案本身編譯時產生的亂碼問題和Java程式於其他媒介互動產生的亂碼問題。

  首先Java(包括JSP)原始檔中很可能包含有中文,而Java和JSP原始檔的儲存方式是基於位元組流的,如果Java和JSP編譯成class檔案過程中,使用的編碼方式與原始檔的編碼不一致,就會出現亂碼。基於這種亂碼,建議在Java檔案中儘量不要寫中文(註釋部分不參與編譯,寫中文沒關係),如果必須寫的話,儘量手動帶引數-ecoding GBK或-ecoding gb2312編譯;對於JSP,在檔案頭加上或基本上就能解決這類亂碼問題。

  本文要重點討論的是第二類亂碼,即Java程式與其他儲存媒介互動時產生的亂碼。很多儲存媒介,如資料庫,檔案,流等的儲存方式都是基於位元組流的,Java程式與這些媒介互動時就會發生字元(char)與位元組(byte)之間的轉換,具體情況如下:

  從頁面form提交資料到java程式 byte->char

  從java程式到頁面顯示 char?>byte

  從資料庫到java程式 byte?>char

  從java程式到資料庫 char?>byte

  從檔案到java程式 byte->char

  從java程式到檔案 char->byte

  從流到java程式 byte->char

  從java程式到流 char->byte

  如果在以上轉換過程中使用的編碼方式與位元組原有的編碼不一致,很可能就會出現亂碼。

  二、解決方法

  前面已經提到了Java程式與其他媒介互動時字元和位元組的轉換過程,如果這些轉換過程中容易產生亂碼。解決這些亂碼問題的關鍵在於確保轉換時使用的編碼方式與位元組原有的編碼方式保持一致,下面分別論述(Java或JSP自身產生的亂碼請參看第一部分)。

  1、JSP與頁面引數之間的亂碼

  JSP獲取頁面引數時一般採用系統預設的編碼方式,如果頁面引數的編碼型別和系統預設的編碼型別不一致,很可能就會出現亂碼。解決這類亂碼問題的基本方法是在頁面獲取引數之前,強制指定request獲取引數的編碼方式:request.setCharacterEncoding("GBK")或request.setCharacterEncoding("gb2312")。

  如果在JSP將變數輸出到頁面時出現了亂碼,可以通過設定response.setContentType("text/html;charset=GBK")或response.setContentType("text/html;charset=gb2312")解決。

  如果不想在每個檔案裡都寫這樣兩句話,更簡潔的辦法是使用Servlet規範中的過慮器指定編碼,過濾器的在web.xml中的典型配置和主要程式碼如下:
[color=red]適用於 post[/color]
1.拷貝tomcat下面 filters
SetCharacterEncodingFilter.java到SRC下面(或再建個包filters)
2.修改web.xml
//亂碼過濾器
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
[color=red]適用於GET[/color]
修改tomcat conf下的server.xml
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
下面加一行
URIEncoding="GBK2312"
呼叫轉換函式
<%!
public String getStr(String s){
String str=s;
try{
byte[] b=str.getBytes("ISO-8859-1");
str=new String(b);
return str;
}catch(Exception e){
return str;
}
}
%>
    2、Java與資料庫之間的亂碼

  大部分資料庫都支援以unicode編碼方式,所以解決Java與資料庫之間的亂碼問題比較明智的方式是直接使用unicode編碼與資料庫互動。很多資料庫驅動自動支援unicode,如Microsoft的SQLServer驅動。其他大部分資料庫驅動,可以在驅動的url引數中指定,如如mm的mysql驅動:jdbc:mysql://localhost/WEBCLDB?useUnicode=true&characterEncoding=GBK。

  3、Java與檔案/流之間的亂碼

  Java讀寫檔案最常用的類是FileInputStream/FileOutputStream和FileReader/FileWriter。其中FileInputStream和FileOutputStream是基於位元組流的,常用於讀寫二進位制檔案。讀寫字元檔案建議使用基於字元的FileReader和FileWriter,省去了位元組與字元之間的轉換。但這兩個類的建構函式預設使用系統的編碼方式,如果檔案內容與系統編碼方式不一致,可能會出現亂碼。在這種情況下,建議使用FileReader和FileWriter的父類:InputStreamReader/OutputStreamWriter,它們也是基於字元的,但在建構函式中可以指定編碼型別:InputStreamReader(InputStream in, Charset cs) 和OutputStreamWriter(OutputStream out, Charset cs)。

  4、其他

  上面提到的方法應該能解決大部分亂碼問題,如果在其他地方還出現亂碼,可能需要手動修改程式碼。解決Java亂碼問題的關鍵在於在位元組與字元的轉換過程中,你必須知道原來位元組或轉換後的位元組的編碼方式,轉換時採用的編碼必須與這個編碼方式保持一致。我們以前使用Resin伺服器,使用smartUpload元件上傳檔案,上傳檔案同時傳遞的中文引數獲取沒有亂碼問題。當在Linux中把Resin設定成服務後,上傳檔案同時的中文引數獲取出現了亂碼。這個問題困擾了我們很久,後來我們分析smartUpload元件的原始檔,因為檔案上傳採用的是位元組流的方式,裡面包含的引數名稱和值也是位元組流的方式傳遞的。smartUpload元件讀取位元組流後再將引數名稱和值從位元組流中解析出來,問題就出現在smartUpload將位元組流轉換成字串時採用了系統預設的編碼,而將Resin設定成服務後,系統預設的編碼可能發生了改變,因此出現了亂碼。後來,我們更改了smartUpload的原始檔,增加了一個屬性charset和setCharset(String)方法,將upload()方法中提取引數語句:

  String value = new String(m_binArray, m_startData, (m_endData - m_startData) + 1 );

  改成了

  String value = new String(m_binArray, m_startData, (m_endData - m_startData) + 1, charset );

  終於解決了這個亂碼問題

相關推薦

JSP中文亂碼處理

自從接觸Java和JSP以來,就不斷與Java的中文亂碼問題打交道,現在終於得到了徹底的解決,現將我們的解決心得與大家共享。   一、Java中文問題的由來   Java的核心和class檔案是基於unicode的,這使Java程式具有良好的跨平臺性,但也帶來了一些中文亂碼問

Tomcat 中 jsp 中文亂碼顯示處理解決方案

JSP 中文亂碼處理解決方案初學JSP,尤其是Tomcat環境,經常會因為中文漢字字符集設定問題導致中文亂碼,本文就這一問題提出解決方案,解決中文亂碼問題,供各位參考,我採用的方案是統一字符集至UTF-

C#對URL中的中文亂碼處理

res quest 類庫 處理 odin .dll 前言 中文亂碼 ring 前言:UTF-8中,一個漢字對應三個字節,GB2312中一個漢字占用兩個字節。 不論何種編碼,字母數字都不編碼,特殊符號編碼後占用一個字節。 1、直接在C#後臺編碼URL參數 引用類庫:Syste

Datastage JDBC Connector 中文亂碼處理

default 中文亂碼 在Datastage中,通常處理中文字符編碼的時候是通過設置工程、JOB、stage三個級別的NLS但JDBC Connector stage這個組件並沒有NLS選項,而是通過 stage裏面的“Properties”選項卡裏面的“Session”-->“Charact

Java中文亂碼處理

art data- data XML direct 中文亂碼處理 new size tracking 一、處理get方法中文亂碼 方法1 String name = new String(request.getParameter("userName&

MySQL中文亂碼處理_字符集轉換處理

MySQL 中文亂碼 字符集轉換-- 中文亂碼修復 -- 查看MySQL服務參數設置mysql> show variables like ‘%character%‘;+--------------------------+----------------------------------+| Vari

Python爬蟲中文小說網點查找小說並且保存到txt(含中文亂碼處理方法)

nbsp nor png erro 請求方式 輸出結果 下載 ros mozilla 從某些網站看小說的時候經常出現垃圾廣告,一氣之下寫個爬蟲,把小說鏈接抓取下來保存到txt,用requests_html全部搞定,代碼簡單,容易上手. 中間遇到最大的問題就是編碼問題,第一抓

spring mvc 中文亂碼處理

param pat encoding mvc ren 處理 web.xml framework 亂碼處理 在 web.xml中添加 <filter> <filter-name>characterEncodingFilter</filt

日誌中文亂碼處理,請求亂碼,響應亂碼,保存數據到數據庫亂碼

conf 服務器 過濾器 close 發布服務 setting open odi idea 1.日誌亂碼處理 中文亂碼需要修改四個部分:1.idea安裝目錄下的bin/idea64.exe.vmoptions和bin/idea.exe.vmoptions追加-Dfile.e

解決jsp中文亂碼問題

解決JSP中文亂碼問題  這篇文章寫得不錯!推薦給大家!大家在JSP的開發過程中,經常出現中文亂碼的問題,可能一至困擾著大家,現把JSP開發中遇到的中文亂碼的問題及解決辦法寫出來供大家參考。首先了解一下Java中文問題的由來: Java的核心和class檔案是基於unicode的

jquery 通過url 進行地址傳參(中文亂碼處理)

一、傳遞引數頁面.html <script type="text/javascript">     var name = 'abc';  //字串英文     var num = 99

Linux mysql 中文亂碼處理

在專案中,通過tomcat上部署的web伺服器,客戶端通過http向伺服器的mysql插入資料,但插入的中文會變成???這樣的內容,原因有很多 1.伺服器沒有對request和response進行編碼處理,這點好解決,可以通過設定字符集來處理 /** * @see HttpServ

java實現Servlet的中文亂碼處理

HttpServletRequest:這個物件封裝了客戶端提交過來的一切資料 客戶端提交資料給服務端(這裡指的是在網頁輸入內容提交servlet處理時,在servlet控制檯的輸出亂碼),如果資料中帶有亂碼,可參照如下方法解決: 如果是GET請求(若無亂碼則無需修改) String n

requests(三):json請求中中文亂碼處理

  最近收到一個問題:json格式請求資料中有中文,導致服務端簽名失敗。 問題詳情: 一位同學在傳送json格式的post請求時,請求資料中有中文內容: {"inputCodes":["6932608700850"],"terminal":{"status":1,"channel":"D002

jsp中文亂碼解決方案

在介紹方法之前我們首先應該清楚具體的問題有哪些,筆者在本部落格當中論述的JSP中文亂碼問題有如下幾個方面:頁面亂碼、引數亂碼、表單亂碼、原始檔亂碼。下面來逐一解決其中的亂碼問題。 一、JSP頁面中文亂碼 在JSP頁面中,中文顯示亂碼有兩種情況:一種是HTML中的中文亂碼,另一種是在JSP中動

JSP---中文亂碼問題

               JSP--中文亂碼問題 關於中文亂碼:  1).在JSP頁面上輸入中文,請求頁面後不出現亂碼:保證contentType=“text/html,charset = UTF-8”,pageEncoding = “UTF-8”中的charset和p

requests:json請求中中文亂碼處理

requests庫中,在處理json格式的請求時呼叫的json.dumps方法引數ensure_ascii預設為True.表示序列化時對中文預設使用的ascii編碼。如果想要顯示中文,則將此引數的值改為False即可。  原始碼修改: 在requests原始碼的models.py檔案中,找到pr

Request物件接收表單請求引數的中文亂碼處理

在開發中,很多人會遇到使用Request物件接收表單請求引數會遇到中文亂碼,至於怎麼處理呢?只需要瞭解其產生亂碼的原因,處理起來還是很容易的,接下來用程式碼演示: * Request接收中文資料 */ public class RequestDemo3 ext

Response物件響應的中文亂碼處理

在開發中,我們經常會遇到使用Response物件響應中文,會遇到亂碼,有些人遇到了不知道怎麼處理,會放在那裡不管,我這裡分享下我對於Response物件響應中文亂的碼處理的一些心得吧: /** * Response響應中文的處理 */ public clas

FlashBuilder 控制檯輸出中文亂碼處理

轉:http://www.cnblogs.com/anfeind/archive/2012/07/10/2584798.html 解決FB的控制檯,輸出ASDOC或是使用FDB時出現亂碼的情況 a)問題描述:使用FB進行 輸出ASDOC或是FDB進行除錯時,經常會出現亂碼的現象 b)問題分析