|
發表者 |
討論內容 |
冷日 (冷日) |
發表時間:2008/3/18 6:40 |
- 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. 註二:這個我沒有測試過,誰要測了跟大家說結果的?
|
|
討論串
- »
[分享]Servlet + JSP + mysql jdbc + chinese (冷日 (冷日), 2008/3/18 6:40)
-
[分享]Apache + Tomcat with mod_jk.so (冷日 (冷日), 2008/3/18 6:40)
-
[分享]Java Server Side 中文解決方案 (冷日 (冷日), 2008/3/18 6:43)
-
[分享]如何讓Tomcat支持中文文件名 (冷日 (冷日), 2008/3/18 6:45)
-
[分享]Apache 及 Tomcat 的結合 (冷日 (冷日), 2008/4/22 14:35)
-
[分享]jsp中使用multipart/form-data類型的form提交亂碼問題 (冷日 (冷日), 2011/1/18 15:59)
-
[分享]Apache Tomcat Connector 實務 (冷日 (冷日), 2015/1/7 7:36)
-
[分享]Linux - Apache + Tomcat 整合配置 (冷日 (冷日), 2015/1/7 7:39)
-
[分享]架設 Apache run 80、Tomcat run 8080 用 mod_jk 架設的步驟 (冷日 (冷日), 2015/1/7 7:44)
-
[分享]Apache HTTP Server 與 Tomcat 的三種連接方式介紹 (冷日 (冷日), 2017/3/3 7:35)
-
[分享]採用 ajp 代理模式配置 Apache + tomcat 實現負載均衡 (冷日 (冷日), 2017/3/3 7:40)
-
[分享]apache 使用 mod_proxy 反向代理 tomcat (冷日 (冷日), 2017/3/3 7:48)
-
[分享]CentOS Linux 7 安裝 Apache 2 與 Tomcat 8 伺服器步驟教學,透過 Proxy 整合 (冷日 (冷日), 2017/3/3 7:54)
|