頁寫的中文不需要轉(zhuǎn)換,寫上你那行就可以顯示中文了
凡從jsp傳出帶中文值的參數(shù),都需要在接收后轉(zhuǎn)換中文
<%@ page contentType="text/html; charset=GB2312"%> 是要在本頁顯示中文的時(shí)候才寫
它不能完成轉(zhuǎn)換中文的功能
要轉(zhuǎn)換中文要使用下面這個(gè)方法:
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世界里面一個(gè)比較麻煩的問題,說麻煩是因?yàn)樯婕懊嫣珜挘蓴?shù)據(jù)庫方面的,操作系統(tǒng)的,webserver的等等。
一般這個(gè)就可以了:
str = new String(str.getBytes("編碼1"),"編碼2");
其中編碼1是操作系統(tǒng)的默認(rèn)編碼,編碼2是你要轉(zhuǎn)換成的編碼。
new String()里面的部分的意思是:把str轉(zhuǎn)按照編碼1的方式轉(zhuǎn)換回byte[] 字節(jié)流,然后按照編碼2的方式再轉(zhuǎn)換成新的str。(str是一個(gè)字
符串,java里面其實(shí)是char[])。
str = new String(str.getBytes(),"編碼2");編碼1省略也是可以的,會按照操作系統(tǒng)的默認(rèn)編碼來轉(zhuǎn)換。
其中編碼2一般為gb2312,也就是中文,但是推薦用gbk,因?yàn)間b2312其實(shí)是gbk的一個(gè)子集,字庫要小一些。utf-8應(yīng)該也可以。是較新的一種
編碼規(guī)則。
------------------------------------------------------------------------------------------------
方法二、中文信息是由前一頁面?zhèn)魅氲?br />先創(chuàng)建一個(gè)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;
}
%>
然后在你要現(xiàn)實(shí)的頁面中調(diào)用該頁面:
<%@ include file="trans.jsp"%>
最后在你要顯示中文的頁面例如你顯示前一個(gè)頁面?zhèn)鬟^來的“userName”,
String userName=trans(request.getParameter("userName"));
----------------------------------------------------------------------------------------------------------
”%>
(2)將Form中的值傳送到數(shù)據(jù)庫中再取出來后全變成了“?”。Form用POST提交數(shù)據(jù),代碼中使用了語句:
String st=new(request.getParameter(“name”).getBytes(“ISO8859_1”)), 而且也聲明了charset=gb2312。
要處理Form中傳遞的中文參數(shù),應(yīng)該在JSP中加入下面的代碼,另外定義一個(gè)專門解決這個(gè)問題的getStr類,然后對接收到的參數(shù)進(jìn)行轉(zhuǎn)換
:
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=“創(chuàng)聯(lián)網(wǎng)絡(luò)技術(shù)中心歡迎您的到來”;
String keyword1=request.getParameter(“keyword1”);
keyword1=getStr(keyword1);
out.print(keyword);
out.print(keyword1);
%>
另外,流行的關(guān)系數(shù)據(jù)庫系統(tǒng)都支持?jǐn)?shù)據(jù)庫Encoding,也就是說在創(chuàng)建數(shù)據(jù)庫時(shí)可以指定它自己的字符集設(shè)置,數(shù)據(jù)庫的數(shù)據(jù)以指定的編
碼形式存儲。當(dāng)應(yīng)用程序訪問數(shù)據(jù)時(shí),在入口和出口處都會有 Encoding 轉(zhuǎn)換。對于中文數(shù)據(jù),數(shù)據(jù)庫字符編碼的設(shè)置應(yīng)當(dāng)保證數(shù)據(jù)的完整性
。 GB2312、GBK、UTF-8 等都是可選的數(shù)據(jù)庫 Encoding,也可以選擇 ISO8859-1 (8-bit), 但會增加了編程的復(fù)雜度,ISO8859-1不是推薦的
數(shù)據(jù)庫 Encoding。在JSP/Servlet編程時(shí),可以先用數(shù)據(jù)庫管理系統(tǒng)提供的管理功能檢查其中的中文數(shù)據(jù)是否正確。
-------------------------------------------------------------------------------------------------------
JSP引擎會將上面的偽指令轉(zhuǎn)換為HTTP應(yīng)答的頭部:
Content-Type: text/html; charset=GB2312
樣輸出的就是采用GB2312編碼的中文頁面,瀏覽器會正確地顯示出中文。但瀏覽器在將form的內(nèi)容POST到服務(wù)器時(shí)卻沒有包含charset,而且將
中文內(nèi)容用%xx的形式(xx是十六進(jìn)制數(shù))進(jìn)行編碼,例如漢字"中"的GB2312內(nèi)碼為0xD6D0,在HTTP請求中就變成了%D6%D0,根據(jù)RFC2616的規(guī)
定,如果在HTTP請求中未指明字符集,就使用ISO8859_1編碼,這樣"中"字在處理時(shí)變成了兩個(gè)字符,分別為´u00D6´和´u0
0D0´,而返回到客戶端時(shí)變成了兩個(gè)不可顯示的字符,瀏覽器一般顯示成´??´。
解決這一問題的傳統(tǒng)做法是編寫額外的代碼來完成字符集的轉(zhuǎn)換:
strOut = new String(strIn.getBytes("8859_1"), "GB2312");
strIn是未經(jīng)過轉(zhuǎn)換的字符串,其編碼為ISO8859_1,strOut是經(jīng)過轉(zhuǎn)換的字符串,其編碼為GB2312。
在Apusic 0.9.5版中實(shí)現(xiàn)了Java Servlets 2.3規(guī)范草案,其中在ServletRequest接口中新增了一個(gè)方法setCharacterEncoding(String enc),
可以補(bǔ)上在HTTP請求中缺少的charset信息,而上面這一煩瑣的轉(zhuǎn)換過程就在Servlet引擎中自動(dòng)完成了,而且Servlet引擎還對轉(zhuǎn)換過程做了優(yōu)
化,提高了運(yùn)行效率。下面給出一個(gè)簡單的例子,大家可以做一下比較。
// 傳統(tǒng)方式
<%@ 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中文顯示問題的幾個(gè)方法
??????????????????????????????? 總結(jié)了以下幾條方法:
??????????????????????????????? 1、在jsp頁中加入一條語句:
??????????????????????????????? <%@ page contentType="text/html;charset=gb2312"
??????????????????????????????? %>中文顯示就正常了。
??????????????????????????????? 2、對于從網(wǎng)頁中的文本框通過String parameter =
??????????????????????????????? request.getParameter(“parameter”);方式獲得的字符串,均是8859_1的編碼,
??????????????????????????????? 如果想把它顯示在網(wǎng)頁上就必須得用parameter = new
??????????????????????????????? String(parameter.getBytes(“8859_1”),”gb2312”)進(jìn)行轉(zhuǎn)換,windows和linux這兩種系統(tǒng)都是一樣的
。
??????????????????????????????? 有一個(gè)簡單方法,就是在 getParameter()
??????????????????????????????? 方法獲取參數(shù)之前,使用request.setCharacterEncoding("GB2312");,將提交的信息轉(zhuǎn)化為
??????????????????????????????? GB2312 編碼。
??????????????????????????????? 3、但是對于將數(shù)據(jù)寫入數(shù)據(jù)庫的問題,采取的方式就不同了:
??????????????????????????????? windows下,必須要采用該字符串轉(zhuǎn)換再插入數(shù)據(jù)庫,而linux下就不需要,而是直接把8859_1編碼的字符
插入。
??????????????????????????????? 如果從數(shù)據(jù)庫中讀出的數(shù)據(jù),對于windows因?yàn)樵诓迦霑r(shí)已經(jīng)做了轉(zhuǎn)換,所以讀出時(shí)已經(jīng)是gb2312的,當(dāng)把
它顯示在網(wǎng)頁上時(shí),不需要做編碼轉(zhuǎn)換,而
??????????????????????????????? linux上的mysql中的數(shù)據(jù)是8859_1的所以要做編碼的轉(zhuǎn)換。
??????????????????????????????? 4、
??????????????????????????????? 如果你給某個(gè)字符串變量賦予一個(gè)中文字符串的值,那么在你取出他時(shí),在網(wǎng)頁上的顯示是不需要做字符
轉(zhuǎn)換的,
??????????????????????????????? 但是如果你要在linux下做字符的比較,則還需要把字符做parameter = new
??????????????????????????????? String(parameter.getBytes(“gb2312”),”8859_1”)的轉(zhuǎn)換。
??????????????????????????????? 5、長江電力網(wǎng)站解決中文問題的方法是:
????????????????????????????????? 1)在catalina.sh文件中的相關(guān)位置添加下面一行
???????????????????????????????????? -Dfile.encoding=GBK \
????????????????????????????????? 2)在每個(gè)jsp文件的最前面添加下面兩行
???????????????????????????????????? <%@ page contentType="text/html;
??????????????????????????????? charset=GBK" %>
???????????????????????????????????? <%request.setCharacterEncoding("GBK");%>
-----------------------------------------------------------------------------------------------------------------------------
---
在基于JAVA的編程中,經(jīng)常會碰到漢字的處里及顯示的問題,比如一大堆亂碼或問號。
這是因?yàn)镴AVA中默認(rèn)的編碼方式是UNICODE,而中國人通常使用的文件和DB都是基于GB2312或者BIG5等編碼,故會出現(xiàn)此問題。以前我也經(jīng)常為
這個(gè)問題而苦惱,后來經(jīng)查了些資料,終于解決了,我知道一定有很多朋友也會碰到這個(gè)問題,所以特就總結(jié)了一下,來拿出來讓大家一起分
享了。
1、在網(wǎng)頁中輸出中文。
JAVA在網(wǎng)絡(luò)傳輸中使用的編碼是"ISO-8859-1",故在輸出時(shí)需要進(jìn)行轉(zhuǎn)化,如:
String? str="中文";
str=new? String(str.getBytes("GB2312"),"8859_1");
但如果在編譯程序時(shí),使用的編碼是“GB2312”,且在中文平臺上運(yùn)行此程序,不會出現(xiàn)此問題,一定要注意。
2、從參數(shù)中讀取中文
這正好與在網(wǎng)頁中輸出相反如:
str=new? String(str.getBytes("8859_1"),"GB2312");
3、操作DB中的中文問題
一個(gè)較簡單的方法是:在“控制面扳”中,把“區(qū)域”設(shè)置為“英語(美國)”。如果還會出現(xiàn)亂碼,還可進(jìn)行如下設(shè)置:
取中文時(shí):str=new? String(str.getBytes("GB2312"));
向DB中輸入中文:str=new? String(str.getBytes("ISO-8859-1"));
4、在JSP中的中文解決:
在“控制面扳”中,把“區(qū)域”設(shè)置為“英語(美國)”.
在JSP頁面中加入:
如果還不行正常顯示,則還要進(jìn)行下面的轉(zhuǎn)換:
如:name=new? String(name.getBytes("ISO-8859-1"),"GBK");
就不會出現(xiàn)中文問題了。
-----------------------------------------------
用JSP轉(zhuǎn)換中文字符在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中字符的表達(dá) 2
2.2 編碼方式的簡介 2
三、J2SE中相關(guān)的函數(shù) 3
四、JSP、數(shù)據(jù)庫的編碼 3
4.1 JSP中的編碼 3
4.2 數(shù)據(jù)庫的編碼 4
五、源文件的編碼 4
5.1 資源文件 4
5.2 源文件 4
附錄:資源 5
?
JAVA字符的編碼
一、概要
在JAVA應(yīng)用程序特別是基于WEB的程序中,經(jīng)常遇到字符的編碼問題。為了防止出現(xiàn)亂碼,首先需要了解JAVA是如何處理字符的,這樣就可以有
目的地在輸入/輸出環(huán)節(jié)中增加必要的轉(zhuǎn)碼。其次,由于各種服務(wù)器有不同的處理方式,還需要多做試驗(yàn),確保使用中不出現(xiàn)亂碼。
二、基本概念
2.1 JAVA中字符的表達(dá)
JAVA中有char、byte、String這幾個(gè)概念。char 指的是一個(gè)UNICODE字符,為16位的整數(shù)。byte 是字節(jié),字符串在網(wǎng)絡(luò)傳輸或存儲前需要轉(zhuǎn)換
為byte數(shù)組。在從網(wǎng)絡(luò)接收或從存儲設(shè)備讀取后需要將byte數(shù)組轉(zhuǎn)換成String。String是字符串,可以看成是由char組成的數(shù)組。String 和
char 為內(nèi)存形式,byte是網(wǎng)絡(luò)傳輸或存儲的序列化形式。
?舉例:
英
String ying = “英”;
char ying = ying.charAt(0);
String yingHex = Integer.toHexString(ying);
82 F1??
byte yingGBBytes = ying.getBytes(“GBK”);
GB編碼的字節(jié)數(shù)值
D3 A2
2.2 編碼方式的簡介
?
String序列化成byte數(shù)組或反序列化時(shí)需要選擇正確的編碼方式。如果編碼方式不正確,就會得到一些0x3F的值。常用的字符編碼方式有ISO88
59_1、GB2312、GBK、UTF-8/UTF-16/UTF-32。
ISO8859_1用來編碼拉丁文,它由單字節(jié)(0-255)組成。
?GB2312、GBK用來編碼簡體中文,它有單字節(jié)和雙字節(jié)混合組成。最高位為1的字節(jié)和下一個(gè)字節(jié)構(gòu)成一個(gè)漢字,最高位為0的字節(jié)是ASCII碼。
UTF-8/UTF-16/UTF-32是國際標(biāo)準(zhǔn)UNICODE的編碼方式。 用得最多的是UTF-8,主要是因?yàn)樗趯∥木幋a時(shí)節(jié)約空間。
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中相關(guān)的函數(shù)
String str =”英”;
?//取得GB2312編碼的字節(jié)
byte[] bytesGB2312 = str.getBytes(“GB2312”);
//取得平臺缺省編碼的字節(jié)(solaris為ISO8859_1,windows為GB2312)
byte[] bytesDefault = str.getBytes();
//用指定的編碼將字節(jié)轉(zhuǎn)換成字符串
?String newStrGB = new String(bytesGB2312, “GB2312”);
?
//用平臺缺省的編碼將字節(jié)轉(zhuǎn)換成字符串(solaris為ISO8859_1,windows為GB2312)
?String newStrDefault = new String(bytesDefault);
?//用指定的編碼從字節(jié)流里面讀取字符
InputStream in = xxx;
InputStreamReader reader = InputStreamReader( in, “GB2312”);
char aChar = reader.read();
四、JSP、數(shù)據(jù)庫的編碼
4.1 JSP中的編碼
(1) 靜態(tài)聲明:
CHARSET有兩個(gè)作用:
JSP文件的編碼方式:在讀取JSP文件、生成JAVA類時(shí),源JSP文件中漢字的編碼
JSP輸出流的編碼方式:在執(zhí)行JSP時(shí),往response流里面寫入數(shù)據(jù)的編碼方式
(2) 動(dòng)態(tài)改變:在往response流里面寫數(shù)據(jù)前可以調(diào)用response.setContentType(),設(shè)定正確的編碼類型。
(3) 在TOMCAT中,由Request.getParameter() 得到的參數(shù),編碼方式都是ISO8859_1。所以如果在瀏覽器輸入框內(nèi)輸入一個(gè)漢字“英”,在服
務(wù)器端就得到一個(gè)ISO8859_1編碼的(0x00,0xD3,0x00,0xA2)。所以通常在接收參數(shù)時(shí)轉(zhuǎn)碼:
String wrongStr = response.getParameter(“name”);
String correctStr = new String(wrongStr.getBytes(“ISO8859_1”),”GB2312”);
在最新的SERVLET規(guī)范里面,也可以在獲取參數(shù)之前執(zhí)行如下代碼:
request.setCharacterEncoding(“GB2312”);
4.2 數(shù)據(jù)庫的編碼
(1) 數(shù)據(jù)庫使用UTF-16
如果String中是UNICODE字符,寫入讀出時(shí)不需要轉(zhuǎn)碼
(2) 數(shù)據(jù)庫使用ISO8859_1
如果String中是UNICODE字符,寫入讀出時(shí)需要轉(zhuǎn)碼
寫入:String newStr = new String(oldStr.getByte(“GB2312”), “ISO8859_1”);
讀出:String newStr = new String(oldStr.getByte(“ISO8859_1”),”GB2312”);
五、源文件的編碼
5.1 資源文件
資源文件的編碼方式和編輯平臺相關(guān)。在WINDOWS平臺下編寫的資源文件,以GB2312方式編碼。在編譯時(shí)需要轉(zhuǎn)碼,以確保在各個(gè)平臺上的正確
性:
native2ascii –encoding GB2312 source.properties
這樣從資源文件中讀出的就是正確的UNICODE字符串。
5.2 源文件
源文件的編碼方式和編輯平臺相關(guān)。在WINDOWS平臺下開發(fā)的源文件,以GB2312方式編碼。在編譯的時(shí)候,需要指定源文件的編碼方式:
javac –encoding GB2312
?JAVA編譯后生成的字節(jié)文件的編碼為UTF-8。
?
①最新版TOMCAT4.1.18支持request.setCharacterEncoding(String enc)
②資源文件轉(zhuǎn)碼成company.name=\u82f1\u65af\u514b
③如果數(shù)據(jù)庫使用utf-16則不需要這部分轉(zhuǎn)碼
④頁面上應(yīng)有
轉(zhuǎn)碼ⅰ:
String s = new String
(request.getParameter(“name”).getBytes(“ISO8859_1”),”GB2312”);
轉(zhuǎn)碼ⅱ:
String s = new String(name.getBytes(“GB2312”),”ISO8859_1”);
轉(zhuǎn)碼ⅲ:
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;
?}
----------------------------------------------------------------------------------
由于各款手機(jī)性能不同,在中文顯示上可能會出現(xiàn)問題,簡單方法用<?xml version="1.0" encoding="GB2312"?>這一句就可以了,我用手機(jī)試
過,沒有問題,但如果是提交可能會有一點(diǎn)問題,經(jīng)過試驗(yàn),發(fā)現(xiàn)顯示中文的最佳解決方法還是利用UNICODE代碼,解決方法是用encoding="ut
f-8",必須用程序?qū)⑥D(zhuǎn)換成unicode,目前未知ASP是否可以轉(zhuǎn)換,但用JAVA或JSP可以有效的解決這個(gè)問題,源代碼如下:
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輸入中文亂碼問題
終于從朋友(低調(diào)一賤男)那里得到解決辦法:
引用:
??? 在發(fā)送url請求的頁面和接收url請求的頁面做如下設(shè)置
<%response.setContentType("text/vnd.wap.wml;charset=UTF-8";%>//utf8
<%request.setCharacterEncoding("UTF-8";%>//參數(shù)處理方式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"> 的方法傳送參數(shù),用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個(gè)文件保存成為utf-8文件格式就可以了。
我的感覺主要是
request.setCharacterEncoding("utf-8";
起到很大作用, 如果輸入頁面是gb2312 格式
接受頁面則要使用
request.setCharacterEncoding("gb2312";
建議還是使用utf-8,因?yàn)橐苿?dòng)網(wǎng)關(guān)用utf-8
-----------------------------------------------------------------------------------------
這個(gè)問題我終于弄明白了,眾所周知的如果讓程序I18N化,指定頁面為UTF-8是目前最好的選擇。可當(dāng)指定為UFT-8后寫死的字符串肯定會出現(xiàn)亂碼的問題(從已設(shè)成中文數(shù)據(jù)庫中讀出的應(yīng)不受影響)。這個(gè)平時(shí)不太重視的問題沒想到解決起來還是很麻煩的,于是使勁鉆研了一把,現(xiàn)在把自己的一心學(xué)習(xí)心得記錄如下。
只須把文件的存貯格式改為UTF-8即可。以editplus為例,document-->encoding type-->UTF-8,保存。windows的記事本也可以的。
我來解釋一下,unicode目前是兩字節(jié)編碼,就可以理解成與ISO的UCS(統(tǒng)一字符集)是一回事。UTF-8就像它的8是單字節(jié)編碼,但它還要表示unicode的編碼字,只不過是為了與廣泛應(yīng)用的單字節(jié)系統(tǒng)兼容,才有的UTF-8,Unicode Transportation Format。 GB2312用的是2字節(jié),其中的ASCII碼字就用前128,當(dāng)是漢字時(shí),第一個(gè)字節(jié)的最高一位就是1,反正是有一個(gè)標(biāo)志以通知系統(tǒng)這是一個(gè)漢字要把其后的一個(gè)字節(jié)連起來解釋成一個(gè)漢字。
UTF-8其實(shí)是差不多的。只不過是漢字時(shí),需要三個(gè)字節(jié),標(biāo)示特點(diǎn)如下:
1110xxxx 10xxxxxx 10xxxxxx
可以數(shù)出來所有的x一共是16位正好可以表示一個(gè)unicode字。
因?yàn)樵趙indows平臺上我們的純文本文件默認(rèn)保存都是按平臺相關(guān)一般中文2000就是GBK,所以當(dāng)頁面指定是UTF-8讀出來的東西肯定要亂碼了。而已UTF-8保存指定UTF-8頁面,就是jsp中寫死的字符串也不會亂碼,而這時(shí)指定為GB2312卻要亂碼了。