JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java Tools  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友   
reply to topicthreaded modego to previous topicgo to next topic
話題被移動
該話題已被移動 - browser , 2003-07-19 06:37
如果您尚不清楚該話題被移動的原因,請參考論壇規則以及本版公告或者聯系本版版主。
本主題所含的標籤
無標籤
作者 struts ActionError 中文處理 [精華]
chrischang





發文: 166
積分: 2
於 2003-07-18 23:44 user profilesend a private message to usersend email to chrischangreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
Dear all

處理 ActionError 所定的 ApplicationResources.properties 假如想要顯示中文一定要轉換成 UTF-8 的格式ㄇ ? 不能直接用 Big5 ?

謝謝 !!


chrischang edited on 2003-07-18 23:46
reply to postreply to post
作者 Re:struts ActionError 中文處理 [Re:chrischang]
CyberJos





發文: 8
積分: 0
於 2003-07-19 00:51 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
不行。

struts 中處理 ActionError 錯誤訊息(或擴展來說國際化訊息)是使用 org.apache.struts.util.MessageResources 這個抽象類別,而讀入 properties 的方法則是實作在繼承它的 org.apache.struts.util.PropertyMessageResources 之中。看一下裡頭的做法就可以知道,它是使用 java.util.Properties 來 load .properties。 參考 http://java.sun.com/j2se/1.4.1/docs/api/java/util/Properties.html 就可以知道 Properties 類別的 load() 方法其傳入值是字元編碼為 ISO-8859-1 的 InputStream,也因此 Big5 中文字不經轉換的話就會吐血。事實上 Unicode 中文字不轉也會吐血,我們的最終目的是使其成為 escape sequence 表示方法的字元,也就是 \uXXXX 這樣的字元。

我來說一下我的作法。首先準備好英文的訊息,檔名就命名為 ApplicationResources.properties 吧(當然你必需要在 web.xml 中設定好),放在 /WEB-INF/classes 之下。內容大致為:

1
error.addguestbook.missing.content=The content is empty.

接著再寫一個檔名為 ApplicationResources.properties.tw:
1
error.addguestbook.missing.content=內文不得空白

然後再使用 native2ascii 工具來轉換:
1
native2ascii ApplicationResources.properties.tw > ApplicationResources_zh_TW.properties

就會得到下列的結果:
1
error.addguestbook.missing.content=\u5167\u6587\u4e0d\u5f97\u7a7a\u767d

要是覺得麻煩,就自己寫個 sh 或是 bat 就一切 ok 了。


reply to postreply to post
作者 Re:struts ActionError 中文處理 [Re:chrischang]
im1000



版主

發文: 149
積分: 7
於 2003-07-19 01:22 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
CyberJos 大大提供了一個標準的解法
不過我有一個比較簡單的解法是透過 Netbean 的 Resources 編輯器

只要定義你要哪些 locale, 自然就會出現那個 column 讓你編輯, ^^~
其他的 IDE 有沒有類似的功能呢 ? 知道的請告知, 謝謝喔 !!


reply to postreply to post
作者 Re:struts ActionError 中文處理 [Re:im1000]
im1000



版主

發文: 149
積分: 7
於 2003-07-19 01:39 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
還有一個見不得人的解決方法
就是修改 struts source code, 重新 compile

這方法有兩個大問題
(1) 當 struts version 改變時候, 你就得抓原始碼修改重新 complie
(2) 一次只能支援一個語系, 完全失去 i18n 的功能

jini 說這是個爛方法, 但是我覺得在不用作各國語系(i18n)時候的專案時蠻好用低.

org.apache.struts.util.PropertyMessageResources.java (version#1.1)

protected synchronized void loadLocale(String localeKey) 這個 method 中
[color="blue"]
messages.put(messageKey(localeKey, key), props.getProperty(key));
[/color]
改成
[color="red"]
try {
String big5Msg = new String(props.getProperty(key).getBytes("ISO-8859-1"),"big5");
messages.put(messageKey(localeKey, key), big5Msg);
} catch ( Exception ex ) {
messages.put(messageKey(localeKey, key), props.getProperty(key));
}
[/color]

如果你要 GB 碼 就把 big5 改成 GBK 吧...
重新 complie 包成 jar, 最好取 struts-by1000-030716.jar
以免未來的時候忘記該用哪個 compile

***** jini 真的說這是個爛方法 ******* 請小心使用


reply to postreply to post
作者 Re:struts ActionError 中文處理 [Re:chrischang]
moszap





發文: 38
積分: 0
於 2003-07-19 14:35 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
OS : win2000 pro
Web Server : tomcat 4.1.18

弟在使用 struts1.1 時,發覺若是在 properties檔內,直接用 中文,已經可以正常顯示了,
不過,若是在 System.err.println(userName); 時,會無法正確地顯示。
可用 new String(userName.getBytes("ISO8859_1"),"Big5");

或是另一種做法:
properties裡,有轉成 \uxxxx , 另在接收參數時,有先用 request.setCharacterEncoding("Big5"); //是在 RequestProcessor裡


reply to postreply to post
作者 Re:struts ActionError 中文處理 [Re:chrischang]
chrischang





發文: 166
積分: 2
於 2003-07-19 16:50 user profilesend a private message to usersend email to chrischangreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
moszap 你說能正常顯示中文 ? 那是怎麼做到的呢 ?

按照上面大大的說法 是一定要轉換的喔 ..

JBuilder 也有 Resource String Wizard 來做 可是發現跟 NetBean 所提供的差太多了 ... 不太好用 .


reply to postreply to post
作者 Re:struts ActionError 中文處理 [Re:chrischang]
moszap





發文: 38
積分: 0
於 2003-07-20 02:25 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
就一樣的使用方式:
application_zh_TW.properties :
welcome.message=我是chinese中文
jsp:
<%@ page contentType="text/html;charSet=Big5" %>
<bean:message key="welcome.message"/>

就會出現 我是chinese中文
不過,用這種做法,會導致另一個若在Action裡接受 form 傳過來的參數時,會出現亂碼,所以,就必需自已轉碼,但這種做法,不好
範例,請參考底下所附的那個檔案
比較好的作法應該是,加一個 RequestProcessor, 裡面去把 request.setCharacterEncoding("Big5");
但更好的做法,應該是設成 UTF-8 吧

testBig5_1.zip (997.87k)


reply to postreply to post
作者 Re:struts ActionError 中文處理 [Re:moszap]
moszap





發文: 38
積分: 0
於 2003-07-20 02:27 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
//參考一下底下的這個程式,會把中英文給轉成\uxxxx
public class TransChinese {

  public static void main(String[] args) {
    String strUn = new String();
    String strCh = new String("我是daadp,中文,abcz成功哈~!@#$%^&*()_<>?[]\\:「」");//主要是用來轉換中文的,若是英文的或標點符號的,也可以,不過{} 這2個不行
    try {
      for(int i = 0 ; i < strCh.length() ; i++) {
        String strSlash = "\\u";
        
        if( ((int)strCh.charAt(i))<=172 ){ //172 指的是 z
          strUn+=""+strCh.charAt(i);
        }  
        
        else {
          strUn += strSlash + Integer.toHexString((int)strCh.charAt(i));
        }
      }
      System.out.println(strUn);
    }
    catch(Exception ex) {System.out.println(ex);}
  }
}


moszap edited on 2003-07-20 02:29
reply to postreply to post
作者 Re:struts ActionError 中文處理 [Re:moszap]
im1000



版主

發文: 149
積分: 7
於 2003-07-20 03:10 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
moszap wrote:
就一樣的使用方式:
application_zh_TW.properties :
welcome.message=我是chinese中文
jsp:
<%@ page contentType="text/html;charSet=Big5" %>
<bean:message key="welcome.message"/>

就會出現 我是chinese中文
不過,用這種做法,會導致另一個若在Action裡接受 form 傳過來的參數時,會出現亂碼,所以,就必需自已轉碼,但這種做法,不好
範例,請參考底下所附的那個檔案
比較好的作法應該是,加一個 RequestProcessor, 裡面去把 request.setCharacterEncoding("Big5");
但更好的做法,應該是設成 UTF-8 吧

的確 ^^"" , utf-8 is better !


reply to postreply to post
作者 Re:struts ActionError 中文處理 [Re:chrischang]
im1000



版主

發文: 149
積分: 7
於 2003-07-20 22:35 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我今天用了 moszap 大大所寫的方法測試中文
編碼原則整個邏輯順序就被搞混了

我採用了 "測試中文成功的宏?" 標準的中文測試字串

中文沒有問題, 代表 big5 沒問題
宏?的"?"測試成功了, 代表 ms950 沒問題
但是成功的"攻"字串因為首位是 '\' 導致問題

我猜測是因為 props.getProperty(key) 的時候出了問題
有人可以解釋一下嗎


reply to postreply to post
作者 Re:struts ActionError 中文處理 [Re:chrischang]
im1000



版主

發文: 149
積分: 7
於 2003-07-20 23:54 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我終於搞懂了 .... moszap 兄你的解法真的是神奇呀
太神奇了, 只能說是許多巧合下的解決方法...

你寫的是
<%@ page contentType="text/html;charSet=Big5" %>
在 tomcat 中看不懂 charSet ( S 是大寫 )
他只看得懂 charset ,,,
所以呢
你寫成 charSet=Big5 jasper 會轉譯成為
response.setContentType("text/html;charSet=big5;charset=ISO-8859-1");

在 server 端執行都採用 'charset' , 所以 ISO-8859-1 都是正確的
但是偏偏度到 "功" 這個字 是'\' 開頭 導致解碼錯誤
然後 因為 browser 不分大小寫
所以抓到的是 第一個為主 就是 big5

太神奇了... 這種解決方法我 trace 流程之後 ... 真的是啞口無言
利用了兩個 bug 負負得正 ^^~
..... 程式的世界真的是太有趣了 ....

不過呢,
你利用的是 tomcat 不了解 charSet
其他的 server 可能是採取 lowcase 比較
我還是建議不要這樣用

good luck


reply to postreply to post
作者 Re:struts ActionError 中文處理 [Re:chrischang]
jini

SoftLeader Taiwan

版主

發文: 1266
積分: 23
於 2003-07-21 02:31 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
補充說明一點
如果 jsp 用
<%@ page contentType="text/html;charSet=big5" %>
servlet temp java file 將轉成
response.setContentType("text/html;charSet=big5;");

Properties 讀進 container 來的是使用 iso-8859-1
但是最後 setContentType 卻沒有將 iso-8859-1 轉成 big5 編碼格式
會導致錯誤."??????"

假設你使用
<%@ page contentType="text/html;charSet=iso-8859-1" %>
browser 預設的 page encoding 將是 西歐語系,
要強制使用或選擇語系才能顯示正確的 中文碼

所以我建議避免這個問題, 使用 \uxxxx\uxxxx 存檔透過 iso-8859-1 傳入 container, iso-8859-1不會對這些值作修改,response 的時候採取 UTF-8
在 response.setContentType("text/html;charSet=UTF-8;");
自然可以轉換支援所有語系

至於編輯的問題可能會比較麻煩
可參考前面幾位介紹的方法, 都十分的不錯 !


reply to postreply to post
作者 Re:struts ActionError 中文處理 [Re:chrischang]
chrischang





發文: 166
積分: 2
於 2003-07-21 10:30 user profilesend a private message to usersend email to chrischangreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
可是有一點很奇怪的是 我已經將 resource 改成 UTF-8 , 但是 contenttype 還是設定成 big5 , 中文還是可以正確的顯示呢 ......

reply to postreply to post
作者 Re:struts ActionError 中文處理 [Re:chrischang]
im1000



版主

發文: 149
積分: 7
於 2003-07-21 10:48 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
chrischang wrote:
可是有一點很奇怪的是 我已經將 resource 改成 UTF-8 , 但是 contenttype 還是設定成 big5 , 中文還是可以正確的顯示呢 ......


這是可以的
但是如果非 big5 的字元將使用 ?? 顯示


reply to postreply to post
作者 Re:struts ActionError 中文處理 [Re:chrischang]
chrischang





發文: 166
積分: 2
於 2003-07-21 11:56 user profilesend a private message to usersend email to chrischangreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
http://www.zaval.org/products/jrc-editor/

找到一個還不錯的 java resource 編輯器 , 打中文會自動幫你存成 utf-8

而且會幫你存成各種 locale 的 resource_XX.properties 檔案


reply to postreply to post
» JWorld@TW »  Java Tools

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8