第一次嘗試給java程序添加系統托盤圖標(TrayIcon),發現菜單顯示中文爲亂碼,一個個小方框,後來在網上找到一位網友的文章《
MenuItem 顯示中文亂碼問題解決方案》,按照裏面的思路解決了。
引用文章裏「問題的緣由」:
1. 本地系統區域語言字符集的問題,咱們的系統可能默認的字符集爲GB2312或GBK。
2. Java源文件編碼字符的問題,若是使用eclipse能夠查看一下java source文件的編碼方式。
3. javac編譯時的字符問題,這一個問題很容易被忽略,運行一下javac能夠看到有一個encoding的參數能夠設置----這一個很重要。
4. 要讀取文件的編碼和讀取時的字符集設置問題,若是咱們要用的字符串不是硬編碼在java源碼中,而是從資源文件中讀取時,就要注意這個問題了。
解決方法呢:
第一種狀況,本地系統的語言字符,咱們管不了;
第二種狀況,轉換一下文件的編碼就行了;
第三種狀況,當咱們檢查肯定Java源文件編碼字符是UTF-8,對javac編譯時的參數設置,增長encoding參數,如:javac -encoding utf8 Test.java
但在Eclipse沒找到相關的設置,只好有如下方法:
1.手工編譯使用到MenuItem的類,目前只發現java.awt包會存在這個問題,swing包能很好的解決這種字符集變換的問題。
2.使用其它編譯方式,如ant、Maven,它們都能配置javac。先給出網友文章給出的Maven例子:
<
build
>
<
plugins
>
<
plugin
>
<
groupId
>org.apache.maven.plugins
</
groupId
>
<
artifactId
>maven-compiler-plugin
</
artifactId
>
<
version
>2.3.2
</
version
>
<
configuration
>
<
source
>1.6
</
source
>
<
target
>1.6
</
target
>
<
encoding
>utf8
</
encoding
>
</
configuration
>
</
plugin
>
....
而我用Ant的:
<
target
name
="compile"
depends
="copyfiles"
>
<
javac
srcdir
="${sourcedir}"
destdir
="${targetdir}"
encoding
="UTF-8"
target
="1.6"
classpathref
="libraries"
/>
</
target
>
4. 要讀取的文件的字符編碼和讀取流編碼,對一個資源文件,咱們也要設置其編碼爲utf8(參照第2條,跟設置java源文件編碼是同樣的),同時在使用流讀取時也要設置流的讀取編碼(這個網上說java字符流的默認的是jvm的編碼,跟系統字符集一致)。
讀取流代碼以下:
BufferedReader br =
new BufferedReader(
new InputStreamReader(
new FileInputStream(langFile),
"utf8"));
這裏還要注意的是:在複製這個資源文件時,最好也設置一下編碼,如用ant複製時:
<
echo
message
="copy conf"
/>
<
copy
file
="D:\klaudisk-client\conf\settings.ini"
tofile
="D:\klaudisk-client\target\conf\settings.ini"
overwrite
="true"
encoding
="utf8"
/>
還能夠使用Properties.load()方法來加載.properties文件(該文件是被java bin下的navie2asc程序處理過的文件),這樣就不用管第4點問題了。
個人問題是第3種狀況,使用Ant來編譯生成jar,解決了!