- Java Server Side 中文解決方案
Java Server Side 中文解決方案 |
| 05/06(一) 08:38am | 在這個網站上看了很多文章關於在Java裡面使用中文的方法,只有嘆氣搖頭。
為什麼要用getBytes然後再轉BIG5呢?這種解決方法從一開始根本就錯了。
最好的解決方法是從資料進來的時候就要正確的抓到資料。
我這一兩個月利用下班時間寫了一個用Java Servlet以及XML/XSL來作的留言
板,同時支援簡體、繁體,甚至日文的輸入與顯示,這是怎麼做到的呢?很
簡單,利用Unicode。
我的servlet處理中文只要兩個指令:
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8"); (此功能j2ee 1.3就有了)
之後不管你要getParameter或是printWriter.write都可以把所有的String直接
拿來用,不用再做什麼轉換。存到database裡面的資料也是直接儲存unicode。
我用的資料庫是PostgreSQL因為它是唯一支援Unicode的開放軟體資料庫(唯一
要注意的是PostgreSQL在initdb要用SQL-ASCII或是UNICODE,不能用
mule-internal,如果你用過PostgreSQL應該知道我在講什麼)。你如
果用的是Oracle或SQLserver, DB2他們的新版應該都是支援Unicode的。mySQL
雖然很快,但是它的功能實在不足(也沒有支援unicode),尤其JDBC的driver
還沒有官方版,不用也罷。
我本來想移植到mySQL上,但是它竟然連resultSet.isBeforeFirst()都沒有
實作,那我怎麼判斷結果有沒有資料啊?
你會說,但是user輸入的是BIG5啊?別擔心,browser早就幫你解決這個問題了。
只要你用response.setContentType("text/html;charset=UTF-8");接下來雖然
你輸入的是big5,但是當browser送出來的時候,它就會根據charset來作編碼轉換。
這樣我們再設request.setCharacterEncoding("UTF-8");然後你用getParameter
時它就會把UTF-8轉成真正的unicode。
這個就是系統的美妙之處了,當你在簡體的系統上看同樣的page時,因為文件的
內容Java已經幫你從unicode轉成UTF-8了,所以你還是可以看到繁體字,而你在
reply這篇文章時雖然用的是GB,但是當從browser送出來的時候,它又轉成UTF-8
了,然後我們的程式一樣處理,當你回到繁體系統來看,又可以看到剛剛發的
簡體的reply。
如果你在英文的系統下,想要copy一篇中文文章進來,絕對不能用BIG5直接貼,
因為這時系統的default encoding不對,轉碼會錯。這時你要先用browser先把
文章讀出來,把"中文字"(不是BIG5碼)copy,貼進來。因為當你在browser裡面
看到中文字時,這個中文字已經是用unicode在顯示了。
所以這個解決方案才能真正做到: "所見即所得"。也就是說,只要你看得到你
輸入的東西,你就可以看到你想要的輸出結果。這也就是你在英文環境下,貼
BIG5的"亂碼",這個程式也會回big5的"亂碼"給你的原因。
Unicode是Java一個對國際化/本土化很好的支援,我們要好好利用這個優點,
做出以前想都沒辦法想的軟體。LinuxFab雖然可以顯示繁體與簡體,但我若是
大陸的使用者,沒看到"簡繁"那小小的兩個字,而在繁體的網頁輸入了簡體呢?
會有問題。除了用unicode,其他解決的方法都會很複雜,現在Java對server
side的國際化支援算是完整了(1.3之前沒有request.setCharaterEncoding(),
總是礙手礙腳),希望大家不要在把unicode當成是不如php, perl的缺點,東
拼西湊的湊到可以顯示中文;把精力放在程式本身,而不是轉碼上。
台灣用Java的人還是不多,尤其是企業;理由不外是performance, 穩定性。
但是你如果知道美國的嘉信理財(我工作的公司),擁有全世界最強大的商用
超級電腦,我們的程式已經有大約20-30%轉換成Java,轉換的工作還在繼續
中,那你會怎麼想?Server side的Java有絕大多數CGI無法比擬的優點:Thread
執行序,在只比較一個request的時候,CGI會佔優勢,但是當成百上千個
request來的時候,Thread的優勢就會出來。我們公司也是在比較過兩者的
表現之後,才決定進行CGI到Java的轉換的。
我的工作是把這些Java的功能加以中文化來提供給住在美國的華裔,對於Java
中文化的問題已經研究了快兩年了,期間碰過不少問題,幸而跟我們合作的IBM
對於我們提出的問題都能迅速改進,所以我還能保住我的工作。其實這些問題,
在apache, tomcat等等的開放原始碼都已經解決了,我真的不得不佩服這些熱
心的人。所以每次我的問題提出來之後,都還會附加:Tomcat不會有這個問題。
我想這多少也刺激他們迅速的改進。
回應本篇 | 回應為新文章 | 刪除本篇 |
RE: Java Server Side 中文解決方案 |
| 05/06(一) 11:57am |
RE: Java Server Side 中文解決方案 |
| 05/08(三) 11:22am | gerrykuo 您好,
可否跟您請教一個問題, 我如果在 Red hat 7.2 用 JAVA 寫一個檔案,
要如何去處理中文字的問題, 因為我只能看到一堆問號..
謝謝
回應本篇 | 回應為新文章 | 刪除本篇 |
RE: Java Server Side 中文解決方案 |
| 05/09(四) 09:09am | : $ cd /etc/X11/fs ; more config ;
看一下你的 big5 true type 字型放在那個目錄.
假設是放在 /usr/share/fonts/zh_TW/TrueType.
$ cd /usr/share/fonts/zh_TW/TrueType ;
$ more fonts.dir ;
應該有下面這一行,(... 表示很多字我省略了)
--> bkai00mp.ttf -arphic-...-c-0-big5-0
$ cd $JAVA_HOME/jre/lib ;
$ cp font.properties.zh.Turbo font.properties.zh
$ vi font.properties.zh
將所有...-c-*-gbk-0改成 -arphic-...-c-0-big5-0
如此就可使用big5中文了.
回應本篇 | 回應為新文章 | 刪除本篇 |
RE: Java Server Side 中文解決方案 |
| 05/09(四) 09:23am | java 內部是使用UNICODE,我們的字型是 big5,故在做I/O時不
要用xxxxStream,應使用Reader/Writer.
可至 www.javasoft.com download java tutorial,
其中 internationalization 章節有提到國際化的問題.
亦可至 www.javaworld.com , 那裡有很多 java 文章.
回應本篇 | 回應為新文章 | 刪除本篇 |
RE: Java Server Side 中文解決方案 |
| 05/09(四) 02:52pm | 謝謝 cylin49 兄的建議, 我的問題已經解決, 我使用的方法如下
FileOutputStream fw = null;
Writer bw = null;
......
fw = new FileOutputStream(dir+"/"+filename);
bw = new OutputStreamWriter(fw, "Big5");
......
// 作寫檔的動作
......
bw.close();
回應本篇 | 回應為新文章 | 刪除本篇 |
RE: Java Server Side 中文解決方案 |
| 05/14(二) 10:47am | UTF-8 is a simple way to work around, but what if the client
doesn't support Unicode at all, e.g., smart phones?
回應本篇 | 回應為新文章 | 刪除本篇 |
|
開板緣由 | | 經由 Java Servlet 的新技術,使用者得以更輕易的撰寫 Server Side
的 Web 應用程式,而由 Java Servlet 所衍生的 Java Server
Page(JSP),則讓使用者以另一種表現方式來發揮 Java 在網路應用
上的高效能。開這個論壇讓 Java 相關應用的玩家們彼此分享... |
|
|
|