頁寫的中文不需要轉換,寫上你那行就可以顯示中文了
凡從jsp傳出帶中文值的參數,都需要在接收后轉換中文
<%@ page contentType="text/html; charset=GB2312"%> 是要在本頁顯示中文的時候才寫
它不能完成轉換中文的功能
要轉換中文要使用下面這個方法:
public String getStr(String str){
??? try{
??????? String temp_p=str;
??????? byte[] temp_t=temp_p.getBytes("ISO8859-1");
??????? String temp=new String(temp_t);
??????? return temp;
??? } catch(Exception e){
??? }
??? return "null";
}
自己加到你的類里面去
------------------------------------------------------------------------------------------------
中文問題是java世界里面一個比較麻煩的問題,說麻煩是因為涉及面太寬,由數據庫方面的,操作系統的,webserver的等等。
一般這個就可以了:
str = new String(str.getBytes("編碼1"),"編碼2");
其中編碼1是操作系統的默認編碼,編碼2是你要轉換成的編碼。
new String()里面的部分的意思是:把str轉按照編碼1的方式轉換回byte[] 字節流,然后按照編碼2的方式再轉換成新的str。(str是一個字
符串,java里面其實是char[])。
str = new String(str.getBytes(),"編碼2");編碼1省略也是可以的,會按照操作系統的默認編碼來轉換。
其中編碼2一般為gb2312,也就是中文,但是推薦用gbk,因為gb2312其實是gbk的一個子集,字庫要小一些。utf-8應該也可以。是較新的一種
編碼規則。
------------------------------------------------------------------------------------------------
方法二、中文信息是由前一頁面傳入的
先創建一個trans.jsp頁面
代碼如下:
<%@ page import="java.io.*"%>
<%! String trans(String chi)
{
?????????????? String result = "";
?????????????? byte temp [];
?????????????? try
?????????????? {
?????????????????????? temp=chi.getBytes("iso-8859-1");
????????????????????? result = new String(temp);
??????????????? }
??????????????? catch(UnsupportedEncodingException e)
??????????????? {
??????????????????????? System.out.println (e.toString());
??????????????? }
??????????? return result;
}
%>
然后在你要現實的頁面中調用該頁面:
<%@ include file="trans.jsp"%>
最后在你要顯示中文的頁面例如你顯示前一個頁面傳過來的“userName”,
String userName=trans(request.getParameter("userName"));
----------------------------------------------------------------------------------------------------------
”%>
(2)將Form中的值傳送到數據庫中再取出來后全變成了“?”。Form用POST提交數據,代碼中使用了語句:
String st=new(request.getParameter(“name”).getBytes(“ISO8859_1”)), 而且也聲明了charset=gb2312。
要處理Form中傳遞的中文參數,應該在JSP中加入下面的代碼,另外定義一個專門解決這個問題的getStr類,然后對接收到的參數進行轉換
:
String keyword1=request.getParameter(“keyword1”);
keyword1=getStr(keyword1);
這樣就可以解決問題了,代碼如下:
<%@ page contentType=“text/html;charset=gb2312”%>
<%!
public String getStr(String str){
try{String temp_p=str;
byte[] temp_t=temp_p.getBytes(“ISO8859-1”);
String temp=new String(temp_t);
return temp;
}
catch(Exception e){ }
return “NULL”;
}
%>
<%--http://www.cndes.com測試--%>
<% String keyword=“創聯網絡技術中心歡迎您的到來”;
String keyword1=request.getParameter(“keyword1”);
keyword1=getStr(keyword1);
out.print(keyword);
out.print(keyword1);
%>
另外,流行的關系數據庫系統都支持數據庫Encoding,也就是說在創建數據庫時可以指定它自己的字符集設置,數據庫的數據以指定的編
碼形式存儲。當應用程序訪問數據時,在入口和出口處都會有 Encoding 轉換。對于中文數據,數據庫字符編碼的設置應當保證數據的完整性
。 GB2312、GBK、UTF-8 等都是可選的數據庫 Encoding,也可以選擇 ISO8859-1 (8-bit), 但會增加了編程的復雜度,ISO8859-1不是推薦的
數據庫 Encoding。在JSP/Servlet編程時,可以先用數據庫管理系統提供的管理功能檢查其中的中文數據是否正確。
-------------------------------------------------------------------------------------------------------
JSP引擎會將上面的偽指令轉換為HTTP應答的頭部:
Content-Type: text/html; charset=GB2312
樣輸出的就是采用GB2312編碼的中文頁面,瀏覽器會正確地顯示出中文。但瀏覽器在將form的內容POST到服務器時卻沒有包含charset,而且將
中文內容用%xx的形式(xx是十六進制數)進行編碼,例如漢字"中"的GB2312內碼為0xD6D0,在HTTP請求中就變成了%D6%D0,根據RFC2616的規
定,如果在HTTP請求中未指明字符集,就使用ISO8859_1編碼,這樣"中"字在處理時變成了兩個字符,分別為´u00D6´和´u0
0D0´,而返回到客戶端時變成了兩個不可顯示的字符,瀏覽器一般顯示成´??´。
解決這一問題的傳統做法是編寫額外的代碼來完成字符集的轉換:
strOut = new String(strIn.getBytes("8859_1"), "GB2312");
strIn是未經過轉換的字符串,其編碼為ISO8859_1,strOut是經過轉換的字符串,其編碼為GB2312。
在Apusic 0.9.5版中實現了Java Servlets 2.3規范草案,其中在ServletRequest接口中新增了一個方法setCharacterEncoding(String enc),
可以補上在HTTP請求中缺少的charset信息,而上面這一煩瑣的轉換過程就在Servlet引擎中自動完成了,而且Servlet引擎還對轉換過程做了優
化,提高了運行效率。下面給出一個簡單的例子,大家可以做一下比較。
// 傳統方式
<%@ page contentType="text/html; charset=gb2312" %>
<html>
<body>
<form method=post action=test.jsp>
<input type=text name=your_name>
</form>
<%= new String(request.getParameter("your_name").getBytes("8859_1"), "GB2312") %>
</body>
</html>
// 新的方式
<%@ page contentType="text/html; charset=gb2312" %>
<% request.setCharacterEncoding("GB2312"); %>
<html>
<body>
<form method=post action=test.jsp>
<input type=text name=your_name>
</form>
<%= request.getParameter("your_name") %>
</body>
</html>
-------------------------------------------------------------------------------------------------------
解決JSP中文顯示問題的幾個方法
??????????????????????????????? 總結了以下幾條方法:
??????????????????????????????? 1、在jsp頁中加入一條語句:
??????????????????????????????? <%@ page contentType="text/html;charset=gb2312"
??????????????????????????????? %>中文顯示就正常了。
??????????????????????????????? 2、對于從網頁中的文本框通過String parameter =
??????????????????????????????? request.getParameter(“parameter”);方式獲得的字符串,均是8859_1的編碼,
??????????????????????????????? 如果想把它顯示在網頁上就必須得用parameter = new
??????????????????????????????? String(parameter.getBytes(“8859_1”),”gb2312”)進行轉換,windows和linux這兩種系統都是一樣的
。
??????????????????????????????? 有一個簡單方法,就是在 getParameter()
??????????????????????????????? 方法獲取參數之前,使用request.setCharacterEncoding("GB2312");,將提交的信息轉化為
??????????????????????????????? GB2312 編碼。
??????????????????????????????? 3、但是對于將數據寫入數據庫的問題,采取的方式就不同了:
??????????????????????????????? windows下,必須要采用該字符串轉換再插入數據庫,而linux下就不需要,而是直接把8859_1編碼的字符
插入。
??????????????????????????????? 如果從數據庫中讀出的數據,對于windows因為在插入時已經做了轉換,所以讀出時已經是gb2312的,當把
它顯示在網頁上時,不需要做編碼轉換,而
??????????????????????????????? linux上的mysql中的數據是8859_1的所以要做編碼的轉換。
??????????????????????????????? 4、
??????????????????????????????? 如果你給某個字符串變量賦予一個中文字符串的值,那么在你取出他時,在網頁上的顯示是不需要做字符
轉換的,
??????????????????????????????? 但是如果你要在linux下做字符的比較,則還需要把字符做parameter = new
??????????????????????????????? String(parameter.getBytes(“gb2312”),”8859_1”)的轉換。
??????????????????????????????? 5、長江電力網站解決中文問題的方法是:
????????????????????????????????? 1)在catalina.sh文件中的相關位置添加下面一行
???????????????????????????????????? -Dfile.encoding=GBK \
????????????????????????????????? 2)在每個jsp文件的最前面添加下面兩行
???????????????????????????????????? <%@ page contentType="text/html;
??????????????????????????????? charset=GBK" %>
???????????????????????????????????? <%request.setCharacterEncoding("GBK");%>
-----------------------------------------------------------------------------------------------------------------------------
---
在基于JAVA的編程中,經常會碰到漢字的處里及顯示的問題,比如一大堆亂碼或問號。
這是因為JAVA中默認的編碼方式是UNICODE,而中國人通常使用的文件和DB都是基于GB2312或者BIG5等編碼,故會出現此問題。以前我也經常為
這個問題而苦惱,后來經查了些資料,終于解決了,我知道一定有很多朋友也會碰到這個問題,所以特就總結了一下,來拿出來讓大家一起分
享了。
1、在網頁中輸出中文。
JAVA在網絡傳輸中使用的編碼是"ISO-8859-1",故在輸出時需要進行轉化,如:
String? str="中文";
str=new? String(str.getBytes("GB2312"),"8859_1");
但如果在編譯程序時,使用的編碼是“GB2312”,且在中文平臺上運行此程序,不會出現此問題,一定要注意。
2、從參數中讀取中文
這正好與在網頁中輸出相反如:
str=new? String(str.getBytes("8859_1"),"GB2312");
3、操作DB中的中文問題
一個較簡單的方法是:在“控制面扳”中,把“區域”設置為“英語(美國)”。如果還會出現亂碼,還可進行如下設置:
取中文時:str=new? String(str.getBytes("GB2312"));
向DB中輸入中文:str=new? String(str.getBytes("ISO-8859-1"));
4、在JSP中的中文解決:
在“控制面扳”中,把“區域”設置為“英語(美國)”.
在JSP頁面中加入:
如果還不行正常顯示,則還要進行下面的轉換:
如:name=new? String(name.getBytes("ISO-8859-1"),"GBK");
就不會出現中文問題了。
-----------------------------------------------
用JSP轉換中文字符在WAP里顯示
<%@ page language="java" contentType="text/vnd.wap.wml;charset=UTF-8"%>
<%!
public static String toUTF(String inPara)
?{
??? char temChr;
??? int ascChr;
??? int i;
??? String rtStr=new String("");
??? if(inPara==null)
??? {
????? inPara="";
??? }
??? for(i=0;i<inPara.length();i++)
??? {
????? temChr=inPara.charAt(i);
????? ascChr=temChr+0;
????? System.out.println(ascChr);
????? System.out.println(Integer.toBinaryString(ascChr));
????? rtStr=rtStr+"&#x"+Integer.toHexString(ascChr)+";";
??? }
??? return rtStr;
? }
%>
<?xml version="1.0"?>
<!-- created by WAPtor (http://www.waptop.net/) -->
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<!-- THIS IS THE FIRST CARD IN THE DECK -->
<card id="MainCard" title="This is a first card">
<p align="center">
? This is a sample text
? 你好
? <%
? out.println("nihao");
? %>
<br/>
<%
out.print(toUTF("你好大幅度法"));
%>
<br/>
你好的</p>
</card>
</wml>
------------------------------------------------------------------------------------------------------
JAVA字符編碼的奧秘
?????
一、概要 2
二、基本概念 2
2.1 JAVA中字符的表達 2
2.2 編碼方式的簡介 2
三、J2SE中相關的函數 3
四、JSP、數據庫的編碼 3
4.1 JSP中的編碼 3
4.2 數據庫的編碼 4
五、源文件的編碼 4
5.1 資源文件 4
5.2 源文件 4
附錄:資源 5
?
JAVA字符的編碼
一、概要
在JAVA應用程序特別是基于WEB的程序中,經常遇到字符的編碼問題。為了防止出現亂碼,首先需要了解JAVA是如何處理字符的,這樣就可以有
目的地在輸入/輸出環節中增加必要的轉碼。其次,由于各種服務器有不同的處理方式,還需要多做試驗,確保使用中不出現亂碼。
二、基本概念
2.1 JAVA中字符的表達
JAVA中有char、byte、String這幾個概念。char 指的是一個UNICODE字符,為16位的整數。byte 是字節,字符串在網絡傳輸或存儲前需要轉換
為byte數組。在從網絡接收或從存儲設備讀取后需要將byte數組轉換成String。String是字符串,可以看成是由char組成的數組。String 和
char 為內存形式,byte是網絡傳輸或存儲的序列化形式。
?舉例:
英
String ying = “英”;
char ying = ying.charAt(0);
String yingHex = Integer.toHexString(ying);
82 F1??
byte yingGBBytes = ying.getBytes(“GBK”);
GB編碼的字節數值
D3 A2
2.2 編碼方式的簡介
?
String序列化成byte數組或反序列化時需要選擇正確的編碼方式。如果編碼方式不正確,就會得到一些0x3F的值。常用的字符編碼方式有ISO88
59_1、GB2312、GBK、UTF-8/UTF-16/UTF-32。
ISO8859_1用來編碼拉丁文,它由單字節(0-255)組成。
?GB2312、GBK用來編碼簡體中文,它有單字節和雙字節混合組成。最高位為1的字節和下一個字節構成一個漢字,最高位為0的字節是ASCII碼。
UTF-8/UTF-16/UTF-32是國際標準UNICODE的編碼方式。 用得最多的是UTF-8,主要是因為它在對拉丁文編碼時節約空間。
UNICODE值 UTF-8編碼
U-00000000 - U-0000007F: 0xxxxxxx
U-00000080 - U-000007FF:? 110xxxxx 10xxxxxx
U-00000800 - U-0000FFFF:? 1110xxxx 10xxxxxx 10xxxxxx
U-00010000 - U-001FFFFF:? 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 - U-03FFFFFF:? 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 - U-7FFFFFFF:? 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
三、J2SE中相關的函數
String str =”英”;
?//取得GB2312編碼的字節
byte[] bytesGB2312 = str.getBytes(“GB2312”);
//取得平臺缺省編碼的字節(solaris為ISO8859_1,windows為GB2312)
byte[] bytesDefault = str.getBytes();
//用指定的編碼將字節轉換成字符串
?String newStrGB = new String(bytesGB2312, “GB2312”);
?
//用平臺缺省的編碼將字節轉換成字符串(solaris為ISO8859_1,windows為GB2312)
?String newStrDefault = new String(bytesDefault);
?//用指定的編碼從字節流里面讀取字符
InputStream in = xxx;
InputStreamReader reader = InputStreamReader( in, “GB2312”);
char aChar = reader.read();
四、JSP、數據庫的編碼
4.1 JSP中的編碼
(1) 靜態聲明:
CHARSET有兩個作用:
JSP文件的編碼方式:在讀取JSP文件、生成JAVA類時,源JSP文件中漢字的編碼
JSP輸出流的編碼方式:在執行JSP時,往response流里面寫入數據的編碼方式
(2) 動態改變:在往response流里面寫數據前可以調用response.setContentType(),設定正確的編碼類型。
(3) 在TOMCAT中,由Request.getParameter() 得到的參數,編碼方式都是ISO8859_1。所以如果在瀏覽器輸入框內輸入一個漢字“英”,在服
務器端就得到一個ISO8859_1編碼的(0x00,0xD3,0x00,0xA2)。所以通常在接收參數時轉碼:
String wrongStr = response.getParameter(“name”);
String correctStr = new String(wrongStr.getBytes(“ISO8859_1”),”GB2312”);
在最新的SERVLET規范里面,也可以在獲取參數之前執行如下代碼:
request.setCharacterEncoding(“GB2312”);
4.2 數據庫的編碼
(1) 數據庫使用UTF-16
如果String中是UNICODE字符,寫入讀出時不需要轉碼
(2) 數據庫使用ISO8859_1
如果String中是UNICODE字符,寫入讀出時需要轉碼
寫入:String newStr = new String(oldStr.getByte(“GB2312”), “ISO8859_1”);
讀出:String newStr = new String(oldStr.getByte(“ISO8859_1”),”GB2312”);
五、源文件的編碼
5.1 資源文件
資源文件的編碼方式和編輯平臺相關。在WINDOWS平臺下編寫的資源文件,以GB2312方式編碼。在編譯時需要轉碼,以確保在各個平臺上的正確
性:
native2ascii –encoding GB2312 source.properties
這樣從資源文件中讀出的就是正確的UNICODE字符串。
5.2 源文件
源文件的編碼方式和編輯平臺相關。在WINDOWS平臺下開發的源文件,以GB2312方式編碼。在編譯的時候,需要指定源文件的編碼方式:
javac –encoding GB2312
?JAVA編譯后生成的字節文件的編碼為UTF-8。
?
①最新版TOMCAT4.1.18支持request.setCharacterEncoding(String enc)
②資源文件轉碼成company.name=\u82f1\u65af\u514b
③如果數據庫使用utf-16則不需要這部分轉碼
④頁面上應有
轉碼ⅰ:
String s = new String
(request.getParameter(“name”).getBytes(“ISO8859_1”),”GB2312”);
轉碼ⅱ:
String s = new String(name.getBytes(“GB2312”),”ISO8859_1”);
轉碼ⅲ:
String s = new String(name.getBytes(“ISO8859_1”),” GB2312”);
---------------------------------------------------------------------------------
static public String StringToUnicode(String text)
?{
??????????????? String result = "";
??????????????? int input;
??????????????? StringReader isr;
??????????????? try
? {
??????????????????????? isr = new StringReader(new String(text.getBytes(),"GBK"));
??????????????? }
??????????????? catch (UnsupportedEncodingException e)
? {
??????????????????????? return "-1";
??????????????? }
??????????????? try {
??????????????????????? while ((input = isr.read()) != -1)
?? {
??????????????????????????????? result = result + "&#x"+Integer.toHexString(input)+";";
??????????????????????? }
??????????????? }
??????????????? catch (IOException e)
? {
??????????????????????? return "-2";
? }
??????????????? isr.close();
??????????????? return result;
}
?
public static String gb2utf(String inStr)
{
?? char temChr;
?? int ascInt;
?? int i;
?? String result=new String("");
?? if(inStr==null)
?{
???? inStr="";
?? }
?? for(i=0;i<inStr.length();i++)
?{
???? temChr=inStr.charAt(i);
???? ascInt=temChr+0;
???? System.out.println(ascInt);
???? System.out.println(Integer.toBinaryString(ascInt));
???? result=result+"&#x"+Integer.toHexString(ascInt)+";";
?? }
? return result;
?}
----------------------------------------------------------------------------------
由于各款手機性能不同,在中文顯示上可能會出現問題,簡單方法用<?xml version="1.0" encoding="GB2312"?>這一句就可以了,我用手機試
過,沒有問題,但如果是提交可能會有一點問題,經過試驗,發現顯示中文的最佳解決方法還是利用UNICODE代碼,解決方法是用encoding="ut
f-8",必須用程序將轉換成unicode,目前未知ASP是否可以轉換,但用JAVA或JSP可以有效的解決這個問題,源代碼如下:
static public String getJsp(String name) throws Exception
{
String var = "";
if (name == null)
return var;
else return new String(name.trim().getBytes("ISO-8859-1"),"GBK");
-----------------------------------------------------------------------------------
JSP編寫WAP輸入中文亂碼問題
終于從朋友(低調一賤男)那里得到解決辦法:
引用:
??? 在發送url請求的頁面和接收url請求的頁面做如下設置
<%response.setContentType("text/vnd.wap.wml;charset=UTF-8";%>//utf8
<%request.setCharacterEncoding("UTF-8";%>//參數處理方式utf8
<%@ page pageEncoding="ISO-8859-1"%>//頁面字符處理方式 iso-8859-1
我的JSP例子說明:
輸入頁面test1.jsp :
<%@ page contentType="text/vnd.wap.wml;charset=gb2312" %>
<%@ page pageEncoding="ISO-8859-1"%>
<?xml version="1.0" ?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<card id="test1" title="漢字輸入">
?<p>
姓名<input name="name"? size="10"/><br/>
號碼<input name="id"? format="*N" size="12"/><br/>
<anchor>確定
? <go href="test2.jsp" method="post">
???? <postfield name="name" value="name"/>
?<postfield name="id" value="id"/>
?
?</go>
</anchor>
</card>
</wml>
//以上使用 <anchor> go method="post"> 的方法傳送參數,用get好像不行
接收頁面test2.jsp :
<%@ page contentType="text/vnd.wap.wml;charset=utf-8" %>
<?xml version="1.0" ?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<card id="test2" title="漢字接收">
<%
request.setCharacterEncoding("utf-8";
String name=request.getParameter("name";
String id=request.getParameter("id";
%>
?<p>姓名:<%=name%></p>
?<p>id:<%=id%></p>
?<do type="prev" label="返回上頁">
<prev/>
</do>
</card>
</wml>
把2個文件保存成為utf-8文件格式就可以了。
我的感覺主要是
request.setCharacterEncoding("utf-8";
起到很大作用, 如果輸入頁面是gb2312 格式
接受頁面則要使用
request.setCharacterEncoding("gb2312";
建議還是使用utf-8,因為移動網關用utf-8
-----------------------------------------------------------------------------------------
這個問題我終于弄明白了,眾所周知的如果讓程序I18N化,指定頁面為UTF-8是目前最好的選擇。可當指定為UFT-8后寫死的字符串肯定會出現亂碼的問題(從已設成中文數據庫中讀出的應不受影響)。這個平時不太重視的問題沒想到解決起來還是很麻煩的,于是使勁鉆研了一把,現在把自己的一心學習心得記錄如下。
只須把文件的存貯格式改為UTF-8即可。以editplus為例,document-->encoding type-->UTF-8,保存。windows的記事本也可以的。
我來解釋一下,unicode目前是兩字節編碼,就可以理解成與ISO的UCS(統一字符集)是一回事。UTF-8就像它的8是單字節編碼,但它還要表示unicode的編碼字,只不過是為了與廣泛應用的單字節系統兼容,才有的UTF-8,Unicode Transportation Format。 GB2312用的是2字節,其中的ASCII碼字就用前128,當是漢字時,第一個字節的最高一位就是1,反正是有一個標志以通知系統這是一個漢字要把其后的一個字節連起來解釋成一個漢字。
UTF-8其實是差不多的。只不過是漢字時,需要三個字節,標示特點如下:
1110xxxx 10xxxxxx 10xxxxxx
可以數出來所有的x一共是16位正好可以表示一個unicode字。
因為在windows平臺上我們的純文本文件默認保存都是按平臺相關一般中文2000就是GBK,所以當頁面指定是UTF-8讀出來的東西肯定要亂碼了。而已UTF-8保存指定UTF-8頁面,就是jsp中寫死的字符串也不會亂碼,而這時指定為GB2312卻要亂碼了。