日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

深入Java中文问题及最优解决方法-下(转)

發(fā)布時間:2025/3/15 java 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入Java中文问题及最优解决方法-下(转) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
4、中文問題的分類及其建議最優(yōu)解決辦法

??? 了解以上JAVA處理文件的原理之后,我們就可以提出了一套建議最優(yōu)的解決漢字問題的辦法。
??? 我們的目標(biāo)是:我們在中文系統(tǒng)中編輯的含有中文字符串或進(jìn)行中文處理的JAVA源程序經(jīng)編譯后可以移值到任何其它的操作系統(tǒng)中正確運(yùn)行,或拿到其它操作系統(tǒng)中編譯后能正確運(yùn)行,能正確地傳遞中文和英文參數(shù),能正確地和數(shù)據(jù)庫交流中英文字符串。
??? 我們的具體思路是:在JAVA程序轉(zhuǎn)碼的入口和出口及JAVA程序同用戶有輸入輸出轉(zhuǎn)換的地方限制編碼方法使之正確即可。

??? 具體解決辦法如下:

??? 1、 針對直接在console上運(yùn)行的類
??? 對于這種情況,我們建議在程序編寫時,如果需要從用戶端接收用戶的可能含有中文的輸入或含有中文的輸出,程序中應(yīng)該采用字符流來處理輸入和輸出,具體來說,應(yīng)用以下面向字符型節(jié)點流類型:
??? 對文件:FileReader,FileWrieter
??????? 其字節(jié)型節(jié)點流類型為:FileInputStream,FileOutputStream
??? 對內(nèi)存(數(shù)組):CharArrayReader,CharArrayWriter
??????? 其字節(jié)型節(jié)點流類型為:ByteArrayInputStream,ByteArrayOutputStream
??? 對內(nèi)存(字符串):StringReader,StringWriter
??? 對管道:PipedReader,PipedWriter
??????? 其字節(jié)型節(jié)點流類型為:PipedInputStream,PipedOutputStream
??? 同時,應(yīng)該用以下面向字符型處理流來處理輸入和輸出:
??? BufferedWriter,BufferedReader
??????? 其字節(jié)型的處理流為:BufferedInputeStream,BufferedOutputStream
??? InputStreamReader,OutputStreamWriter
??? 其字節(jié)型的處理流為:DataInputStream,DataOutputStream
??? 其中InputStreamReader和InputStreamWriter用于將字節(jié)流按照指定的字符編碼集轉(zhuǎn)換到字符流,如:
??? InputStreamReader in = new InputStreamReader(System.in,"GB2312");
??? OutputStreamWriter out = new OutputStreamWriter (System.out,"GB2312");
??? 例如:采用如下的示例JAVA編碼就達(dá)到了要求:

??? //Read.java
??? import java.io.*;
??? public class Read {
??? public static void main(String[] args) throws IOException {
??? String str = "/n中文測試,這是內(nèi)部硬編碼的串"+"/ntest english character";
??? String strin= "";
??? BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in,"gb2312")); //設(shè)置輸入接口按中文編碼
??? BufferedWriter stdout = new BufferedWriter(new OutputStreamWriter(System.out,"gb2312")); //設(shè)置輸出接口按中文編碼
??? stdout.write("請輸入:");
??? stdout.flush();
??? strin = stdin.readLine();
??? stdout.write("這是從用戶輸入的串:"+strin);
??? stdout.write(str);
??? stdout.flush();
??? }}
??? 同時,在編譯程序時,我們用以下方式來進(jìn)行:
??? javac -encoding gb2312 Read.java
??? 其運(yùn)行結(jié)果如圖5所示:

??? 圖5
2、 針對EJB類和不可以直接運(yùn)行的支持類(如JavaBean類)

??? 由于這種類它們本身被其它的類調(diào)用,不直接與用戶交互,故對這種類來說,我們的建議的處理方式是內(nèi)部程序中應(yīng)該采用字符流來處理程序內(nèi)部的中文字符串(具體如上面一節(jié)中一樣),同時,在編譯類時用-encoding gb2312參數(shù)指示源文件是中文格式編碼的即可。


??? 3、 針對Servlet類

??? 針對Servlet,我們建議用以下方法:

??? 在編譯Servlet類的源程序時,用-encoding指定編碼為GBK或GB2312,且在向用戶輸出時的編碼部分用response對象的setContentType("text/html;charset=GBK");或gb2312來設(shè)置輸出編碼格式,同樣在接收用戶輸入時,我們用request.setCharacterEncoding("GB2312");這樣無論我們的servlet類移植到什么操作系統(tǒng)中,只有客戶端的瀏覽器支持中文顯示,就可以正確顯示。如下是一個正確的示例:

??? //HelloWorld.java
??? package hello;
??? import java.io.*;
??? import javax.servlet.*;
??? import javax.servlet.http.*;
??? public class HelloWorld extends HttpServlet
??? {
??? public void init() throws ServletException { }
??? public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
??? {
??? request.setCharacterEncoding("GB2312"); //設(shè)置輸入編碼格式
??? response.setContentType("text/html;charset=GB2312"); //設(shè)置輸出編碼格式
??? PrintWriter out = response.getWriter(); //建議使用PrintWriter輸出
??? out.println("<hr>");
??? out.println("Hello World! This is created by Servlet!測試中文!");
??? out.println("<hr>");
??? }
??? public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
??? {
??? request.setCharacterEncoding("GB2312"); //設(shè)置輸入編碼格式
??? response.setContentType("text/html;charset=GB2312"); //設(shè)置輸出編碼格式
??? String name = request.getParameter("name");
??? String id = request.getParameter("id");
??? if(name==null) name="";
??? if(id==null) id="";
??? PrintWriter out = response.getWriter(); //建議使用PrintWriter輸出
??? out.println("<hr>");
??? out.println("你傳入的中文字串是:" + name);
??? out.println("<hr>你輸入的id是:" + id);
??? out.println("<hr>");
??? }
??? public void destroy() { }
??? }
??????? 請用javac -encoding gb2312 HelloWorld.java來編譯此程序。
??????? 測試此Servlet的程序如下所示:
??? <%@page contentType="text/html; charset=gb2312"%>
??? <%request.setCharacterEncoding("GB2312");%>
??? <html><head><title></title>
??? <Script language="JavaScript">
??? function Submit() {
??? //通過URL傳遞中文字符串值給Servlet
??? document.base.action = "./HelloWorld?name=中文";
??? document.base.method = "POST";
??? document.base.submit();
??? }
??? </Script>
??? </head>

<body bgcolor="#FFFFFF" text="#000000" topmargin="5">
??? <form name="base" method = "POST" target="_self">
??? <input name="id" type="text" value="" size="30">
??? <a href = "JavaScript:Submit()">傳給Servlet</a>
??? </form></body></html>
??? 其運(yùn)行結(jié)果如圖6所示:

??? 圖6
??? 4、 JAVA程序和數(shù)據(jù)庫之間

??? 為避免JAVA程序和數(shù)據(jù)庫之間數(shù)據(jù)傳遞出現(xiàn)亂碼現(xiàn)象,我們建議采用以下最優(yōu)方法來處理:
??? 1、 對于JAVA程序的處理方法按我們指定的方法處理。
??? 2、 把數(shù)據(jù)庫默認(rèn)支持的編碼格式改為GBK或GB2312的。

??? 如:在mysql中,我們可以在配置文件my.ini中加入以下語句實現(xiàn):
??? 在[mysqld]區(qū)增加:
??? default-character-set=gbk
??? 并增加:
??? [client]
??? default-character-set=gbk
??? 在SQL Server2K中,我們可以將數(shù)據(jù)庫默認(rèn)的語言設(shè)置為Simplified Chinese來達(dá)到目的。

??? 5、 針對JSP代碼

??? 由于JSP是在運(yùn)行時,由WEB容器進(jìn)行動態(tài)編譯的,如果我們沒有指定JSP源文件的編碼格式,則JSP編譯器會獲得服務(wù)器操作系統(tǒng)的file.encoding值來對JSP文件編譯的,它在移植時最容易出問題,如在中文win2k中可以很好運(yùn)行的jsp文件拿到英文linux中就不行,盡管客戶端都是一樣的,那是因為容器在編譯JSP文件時獲取的操作系統(tǒng)的編碼不同造成的(在中文wink中的file.encoding和在英文Linux中file.encoding是不同的,且英文Linux的file.encoding對中文不支持,所以編譯出來的JSP類就會有問題)。網(wǎng)絡(luò)上討論的大多數(shù)是此類問題,多是因為JSP文件移植平臺時不能正確顯示的問題,對于這類問題,我們了解了JAVA中程序編碼轉(zhuǎn)換的原理,解決起來就容易多了。我們建議的解決辦法如下:

??? 1、我們要保證JSP向客戶端輸出時是采用中文編碼方式輸出的,即無論如何我們首先在我們的JSP源代編中加入以下一行:

??? <%@page contentType="text/html; charset=gb2312"%>
??? 2、為了讓JSP能正確獲得傳入的參數(shù),我們在JSP源文件頭加入下面一句:
??? <%request.setCharacterEncoding("GB2312");%>
??? 3、為了讓JSP編譯器能正確地解碼我們的含有中文字符的JSP文件,我們需要在JSP源文件中指定我們的JSP源文件的編碼格式,具體來說,我們在JSP源文件頭上加入下面的一句即可:
??? <%@page pageEncoding="GB2312"%>或<%@page pageEncoding="GBK"%>
??? 這是JSP規(guī)范2.0新增加的指令。
??? 我們建議使用此方法來解JSP文件中的中文問題,下面的代碼是一個正確做法的JSP文件的測試程序:

//testchinese.jsp
??? <%@page pageEncoding="GB2312"%>
??? <%@page contentType="text/html; charset=gb2312"%>
??? <%request.setCharacterEncoding("GB2312");%>
??? <%
??? String action = request.getParameter("ACTION");
??? String name = "";
??? String str = "";
??? if(action!=null && action.equals("SENT"))
??? {
??? name = request.getParameter("name");
??? str = request.getParameter("str");
??? }
??? %>
??? <html>
??? <head>
??? <title></title>
??? <Script language="JavaScript">
??? function Submit()
??? {
??? document.base.action = "?ACTION=SENT&str=傳入的中文";
??? document.base.method = "POST";
??? document.base.submit();
??? }
??? </Script>
??? </head>
??? <body bgcolor="#FFFFFF" text="#000000" topmargin="5">
??? <form name="base" method = "POST" target="_self">
??? <input type="text" name="name" value="" size="30">
??? <a href = "JavaScript:Submit()">提交</a>
??? </form>
??? <%
??? if(action!=null && action.equals("SENT"))
??? {
??? out.println("<br>你輸入的字符為:"+name);
??? out.println("<br>你通過URL傳入的字符為:"+str);
??? }
??? %>
??? </body>
??? </html>
??? 如圖7是此程序運(yùn)行的結(jié)果示意圖:

??? 圖7

??? 5、總結(jié)

??? 在上面的詳細(xì)分析中,我們清晰地給出了JAVA在處理源程序過程中的詳細(xì)轉(zhuǎn)換過程,為我們正確解決JAVA編程中的中文問題提供了基礎(chǔ)。同時,我們給出了認(rèn)為是最優(yōu)的解決JAVA中文問題的辦法。

??? 6、參考資料
???? 1、段明輝.Java 編程技術(shù)中漢字問題的分析及解決.
??????? http://www-900.ibm.com/developerWorks/cn/java/java_chinese/index.shtml
???? 2、 周競濤.關(guān)于Java中文問題的幾條分析原則
??????? http://www-900.ibm.com/developerWorks/cn/java/l-javachinese/index.shtml

總結(jié)

以上是生活随笔為你收集整理的深入Java中文问题及最优解决方法-下(转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。