2007-02-02 11:59:01逸&瑩

JSP / Servlet 怎樣才能處理中文?

首先,如何正確的了解您一個 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() %>
out.println("大家好");
</body>
</html>
----------------------
關鍵在第一行。有了這一行就行了。

而如果使用 POST 時,要使用中文就先看下面的例子

test2.jsp
----------------------
<html>
<head>
<title>Instropection</title>
</head>
<meta http-equiv="Content-Type" content="text/html; charset=big5">
<body>
<body bgcolor="#FFFFFF" text="#000000">
<form name="form1" action="test3.jsp" method="post" >
<p> 姓名:
<input type="text" name="name">
</p>
<p>編號:
<input type="text" name="number">
</p>
<p>
<input type="submit" value="傳送">
<input type="reset" value="清除">
</p>
</form>
</body>
</html>
----------------------

test3.jsp
----------------------
<%@ page language="java" contentType="text/html;charset=Big5" %>
<html>
<head>
<title>Instropection</title>
</head>
<body>
<%
String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "Big5");
String number = request.getParameter("number");
%>
姓名:<%= name %>
<br>編號:<%= number %>
</body>
</html>
----------------------
關鍵在於 String(str.getBytes("ISO-8859-1"), "Big5"), java.lang.String 的建構函式可以產生指定特定語系的 String, 透過這個範例,可以使 String 正確地轉換中文。

For Hacker:

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