伊峰獨(dú)居

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            30 隨筆 :: 30 文章 :: 5 評論 :: 0 Trackbacks

          頁寫的中文不需要轉(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è)字符,分別為&acute;u00D6&acute;和&acute;u0


          0D0&acute;,而返回到客戶端時(shí)變成了兩個(gè)不可顯示的字符,瀏覽器一般顯示成&acute;??&acute;。


          解決這一問題的傳統(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
          ? &#x4f60;&#x597d;
          ? <%
          ? 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卻要亂碼了。

          posted on 2006-09-03 18:52 伊峰 閱讀(695) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 日喀则市| 嘉善县| 青川县| 漠河县| 留坝县| 永善县| 泰来县| 香格里拉县| 曲松县| 平邑县| 深水埗区| 高淳县| 黄冈市| 巴楚县| 东乌珠穆沁旗| 隆安县| 麟游县| 大渡口区| 金沙县| 囊谦县| 平谷区| 甘肃省| 景泰县| 沙雅县| 卢龙县| 铜川市| 平和县| 容城县| 台山市| 汕尾市| 青阳县| 阜城县| 神农架林区| 嘉祥县| 兴仁县| 民乐县| 木里| 黄骅市| 双城市| 榆树市| 渝北区|