茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1735404 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
PIMG_00350.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

爪哇咖啡屋 : [分享]Servlet + JSP + mysql jdbc + chinese

發表者 討論內容
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15773
[分享]Servlet + JSP + mysql jdbc + chinese
作者 Yuan-Chen Cheng <ycheng@sinica.edu.tw>, 看板 BSD
標題 Servlet + JSP + mysql jdbc + chinese
時間 Computing Center, Academia Sinica (Thu Sep 21 00:26:49 2000)
路徑 bbs.yzu!news.yzu!news.ncu!news.csie.ncu!netnews.csie.nctu!news.civil.nc
來源 140.109.7.52

JSP / Servlet 怎樣才能處理中文.
順便談 mysql jdbc + 中文

鄭原真 (ycheng@sinica.edu.tw)

Copyright 2000.
本文版權 : GPL or BSD style, 請保留作者姓名。

本文假設你已經會使用 JSP 或是 Servlet 撰寫英文的 Web-Page.
如果你還不會,或是根本不知道 JSP 或是 Servlet 是幹什麼的,
那這篇文章不是寫給你看的。

在 Java Servlet Spec v2.0 中,對於多國語言的支援,並不足。
你必須找到 Java Servlet Spec v2.2 的實作才行,筆者試過的
是 Apache Jakarta Tomcat 3.1 軟體(註一)。

本文測試平台是 Debian Woody, Sun jdk1.2.2, Tomcat 3.1,
mm.mysql-2.0.2


Java Server 如何處理中文.

前言

首先, 如何正確的了解你一個 Big5 中文在 Java 中是正確的
中文 Unicode 呢 ?

輸出一個 String("今").length() 吧 ! 由於 "今" 在 Big5 是由兩個
byte 組成, 但對 java 來說,java 的字元是 unicode, 也就是說,
無論是一個英文字或是一個中文字,其 length() 都是 1. 也就是說,
(new String("今")).length() ==> 1。才是正確的。


Servlet 輸出中文的一個例子.

下面是一個典型的 Java Servlet.
HelloWorldExample.java =>
----------- cut here -----------------
import java.io.*;
import java.text.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class HelloWorldExample extends HttpServlet {

    public void doGet(HttpServletRequest request,
                      HttpServletResponse response)
        throws IOException, ServletException
    {
        response.setLocale(new Locale(new String("zh"), new String("TW")));
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();

        out.println("<html>");
        out.println("<head>");

        String title = new String("hello 大家好");

        out.println("<title>" + title + "</title>");
        out.println("</head>");
        out.println("<body bgcolor=\"white\">");
        out.println("<body>");

        out.println("<p>");

        out.println("<h1>" + title + "</h1>");
        out.println("</body>");
        out.println("</html>");
    }
}
----------- cut here -----------------

可以正常輸出中文的關鍵是:
        response.setLocale(new Locale(new String("zh"), new String("TW")));

注意這一行應該要放在
        PrintWriter out = response.getWriter();

之前執行。另外編譯時注意
        javac -encoding Big5 HelloWorldExample.java

或是 (linux 上的 jdk1.2.2)
        export LANG=zh_TW.Big5
        export LC_CTYPE=zh_TW.Big5
        javac HelloWorldExample.java

注意, 這個例子在 jserv v1.1.2 並不能 work, 因為該版本實做的
JavaSoft Java Servlet APIs 2.0, 而 setLocale 是到
Servlet APIs 2.2 才有。


Java Server Page 如何處理中文

在此簡略說明,先看下面的例子:
test.jsp
----------------------
<%@ page contentType="text/html; charset=big5" %>
<html>
<body bgcolor="white">
中文TEST.<p>
<%= (new String("今天")).length() %>
</body>
</html>
----------------------

關鍵在第一行。有了這一行就行了。

For Hacker:

理論上這一行可以放在文件的任何地方,但由於 Java 時做上
開檔案後通探N必須指定 encoding,當 java jsp engine 發現 charset
跟 default 不同時,通常必須重新開檔案。所以實做上這一行放在越前面越好。
不過話是這樣說,由於通?jsp 會在 run time 被 compile 成 java bytecode,
也就是說只有在 .jsp 更新時才需要 recompile。overhead 實在有限。


Java 連結到 MySql 如何使用中文

Java 以 jdbc 連結到 databases server,MySql 有 Free 的
jdbc driver. 以下不擬說明如何使用 jdbc, 僅說明如何修改
你的 code 使可以用中文。

mysql 儲存中文資料有兩種方法, 第一種是使用 big5 內碼儲存,
其優點是葫棫w碟/記憶體空間, 相較於使用 UTF8 之下, 若輸出
為 Big5,更省去一次的 Unicode (UTF8) 與 Big5 需要經過
Table lookup 的轉換。但使用 Big5 就會有 Big5 先天上的問題。
典型的問題是 Big5 字串在處理字的邊界的問題。Big5 先天上的
問題是這樣的,就以 "問題" 這個字串為例,問字的第二個 byte
跟題字的第一個 byte 所形成的字是 "暋" 字。所以當我們在作
文字搜尋找包含 "暋" 的字串,我們會連包含 "問題" 的字串也
一起找到。但 UTF8 內碼在設計上就避開了這個問題, 犧牲的是
必須用較多的 byte (octets) 表示。

我只有試過 MySql 內的 Data 用 UTF8, Big5 沒試過。要注意的
是,在 UTF8 中,中文的長度是 3 個 bytes, 由於 MySQL 固定
字串欄位送進過長的資料時,會發生過長處被截斷。但 MySql 不懂
UTF8, 所以可能發生一個 UTF8 字元第二 or 三個 byte 被截掉
問題,在 ASCII 中問題不大,頂多出現一個 "I Love Yo", "u" 不
見了。但在 java 把資料讀進來,把 UTF8 轉成 java 內部的表示
法時,就會發生有些 Byte 無法轉成功的問題,應該會造成
Exception. (註二)

好, 回來,在 jdbc 中,並沒有規範在 Database 中的字元的內碼,
而把這個問題留給各個 jdbc driver 處理。mysql jdbc driver
要在 database 中設為 utf8 的設定方式如下:
        Properties pr;
        Connection db;

        pr = new Properties();
        pr.put("characterEncoding", "UTF8");
        pr.put("useUnicode", "TRUE");
        Class.forName("org.gjt.mm.mysql.Driver").newInstance();
        db = DriverManager.getConnection("jdbc:mysql:///test", pr);

其餘請自行參考一般 jdbc 程式寫作的資料。當然, compile 此 Servlet 時需
要在呼叫 javac 時加上 "-encoding Big5"。

若要使用 Big5 的話, 上面 "UTF8" 改成 "Big5" 即可。但這樣作會出現另一個
問題, 就是中文第二個 byte 有 '\' 的問題。這個問題我不知道有沒有方便的解
法,不知道 compile mysql 時將 encoding 設為 big5 可否解決這個問題。(註二)

註一:請到 http://jakarta.apache.org/ 下去 Download.
註二:這個我沒有測試過,誰要測了跟大家說結果的?
前一個主題 | 下一個主題 | | | |

討論串




Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|