我們的程序經常會出現這樣一個問題
在WinXp下測試是正常的
而到了服務器(Linux操作系統)上就出現這個問題
由於郵件我寫的程序的郵件主題是寫在配置文件(
properties)中的
再通過native
ascii把中文郵件主題從本地碼(簡體中文Wind Xp 是GBK)轉換為Unicode 編碼
而Java程序讀取properties配置文件內容時
是根據操作的編碼方式來讀取的
這樣就造成程序的可移植性差
沒有指定郵件主題的編碼方式
當一段 Text 或者 HTML 通過電子郵件傳送時
發送的內容首先通過一種指定的字符編碼轉化成
字節串
然後再把
字節串
通過一種指定的傳輸編碼(Content
Transfer
Encoding)進行轉化得到另一串
字節串
比如
打開一封電子郵件源代碼
可以看到類似的內容
Content
Type: text/plain;charset=
gb
Content
Transfer
Encoding: base
sbG+qcrQuqO
cf
yee
bGjz
W
+b
wudzA
dbQ
MQNCg
KvPKzxqO
uqO
cnnsaPW
NDEDQoNCg==
最常用的 Content
Transfer
Encoding 有 Base
和 Quoted
Printable 兩種
在對二進制文件或者中文文本進行轉化時
Base
得到的
字節串
比 Quoted
Printable 更短
在對英文文本進行轉化時
Quoted
Printable 得到的
字節串
比 Base
更短
郵件的標題
用了一種更簡短的格式來標注
字符編碼
和
傳輸編碼
比如
標題內容為
中
則在郵件源代碼中表示為
// 正確的標題格式
Subject: =?GB
?B?
tA=?=
其中
第一個
=?
與
?
中間的部分指定了字符編碼
在這個例子中指定的是 GB
?
與
?
中間的
B
代表 Base
如果是
Q
則代表 Quoted
Printable
最後
?
與
?=
之間的部分
就是經過 GB
轉化成字節串
再經過Base
轉化後的標題內容
如果
傳輸編碼
改為 Quoted
Printable
同樣
如果標題內容為
中
// 正確的標題格式
Subject: =?GB
?Q?=D
=D
?=
如果閱讀郵件時出現亂碼
一般是因為
字符編碼
或
傳輸編碼
指定有誤
或者是沒有指定
比如
有的發郵件組件在發送郵件時
標題
中
// 錯誤的標題格式
Subject: =?ISO
?Q?=D
=D
?=
這樣的表示
實際上是明確指明了標題為 [
x
D
x
D
]
即
ÖÐ
而不是
中
解決方法
(
)
修改操作系統編碼方式為GBK
或在服務器上通過native
ascii把郵件主題重新生成Unicode 編碼
並更新配置文件內容
(
)
給郵件主題指定編碼方式
sun
misc
BASE
Encoder enc = new sun
misc
BASE
Encoder();
msg
setSubject(
=?GB
?B?
+enc
encode(subject
getBytes())+
?=
);
建議
帶有中文的配置文件
盡量不用*
properties文件
而用XML文件替代
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26904.html