細心!用心!耐心!

          吾非文人,乃市井一俗人也,讀百卷書,跨江河千里,故申城一游; 一兩滴辛酸,三四年學業,五六點粗墨,七八筆買賣,九十道人情。

          BlogJava 聯系 聚合 管理
            1 Posts :: 196 Stories :: 10 Comments :: 0 Trackbacks

          JavaMail發送中文郵件亂碼的解決

              我們的程序經常會出現這樣一個問題,在WinXp下測試是正常的,而到了服務器(Linux操作系統)上就出現這個問題。
              1、    由于郵件我寫的程序的郵件主題是寫在配置文件(. properties)中的,再通過native2ascii把中文郵件主題從本地碼(簡體中文Wind Xp 是GBK)轉換為Unicode 編碼。而Java程序讀取properties配置文件內容時,是根據操作的編碼方式來讀取的,這樣就造成程序的可移植性差。
              2、    沒有指定郵件主題的編碼方式
              當一段 Text 或者 HTML 通過電子郵件傳送時,發送的內容首先通過一種指定的字符編碼轉化成“字節串”,然后再把“字節串”通過一種指定的傳輸編碼(Content-Transfer-Encoding)進行轉化得到另一串“字節串”。比如,打開一封電子郵件源代碼,可以看到類似的內容:
          Content-Type: text/plain;charset="gb2312"
          Content-Transfer-Encoding: base64
          sbG+qcrQuqO17cf4yee74bGjz9W7+b3wudzA7dbQ0MQNCg0KvPKzxqO6uqO17cnnsaPW0NDEDQoNCg==
          最常用的 Content-Transfer-Encoding 有 Base64 和 Quoted-Printable 兩種。在對二進制文件或者中文文本進行轉化時,Base64 得到的“字節串”比 Quoted-Printable 更短。在對英文文本進行轉化時,Quoted-Printable 得到的“字節串”比 Base64 更短。
              郵件的標題,用了一種更簡短的格式來標注“字符編碼”和“傳輸編碼”。比如,標題內容為 "中",則在郵件源代碼中表示為:
          // 正確的標題格式
          Subject: =?GB2312?B?1tA=?=
          其中,
          第一個“=?”與“?”中間的部分指定了字符編碼,在這個例子中指定的是 GB2312。
          “?”與“?”中間的“B”代表 Base64。如果是“Q”則代表 Quoted-Printable。
          最后“?”與“?=”之間的部分,就是經過 GB2312 轉化成字節串,再經過Base64 轉化后的標題內容。
          如果“傳輸編碼”改為 Quoted-Printable,同樣,如果標題內容為 "中":
          // 正確的標題格式
          Subject: =?GB2312?Q?=D6=D0?=
              如果閱讀郵件時出現亂碼,一般是因為“字符編碼”或“傳輸編碼”指定有誤,或者是沒有指定。比如,有的發郵件組件在發送郵件時,標題 "中":
          // 錯誤的標題格式
          Subject: =?ISO-8859-1?Q?=D6=D0?=
          這樣的表示,實際上是明確指明了標題為 [0x00D6, 0x00D0],即 "ÖÐ",而不是 "中"。
              3、    解決方法
          (1):修改操作系統編碼方式為GBK,或在服務器上通過native2ascii把郵件主題重新生成Unicode 編碼,并更新配置文件內容;
          (2):給郵件主題指定編碼方式:
          sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder(); 
          msg.setSubject("=?GB2312?B?"+enc.encode(subject.getBytes())+"?=");
              建議:帶有中文的配置文件,盡量不用*. properties文件,而用XML文件替代。

          posted on 2007-05-06 12:04 張金鵬 閱讀(687) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 太谷县| 贵溪市| 黎城县| 滦平县| 亳州市| 锦屏县| 班戈县| 自治县| 平湖市| 保定市| 安塞县| 怀集县| 西丰县| 广南县| 辽源市| 贵定县| 梅河口市| 宽城| 虎林市| 眉山市| 湟中县| 尤溪县| 台山市| 阜康市| 涿鹿县| 营口市| 铁力市| 平邑县| 胶州市| 沭阳县| 中山市| 巫溪县| 平昌县| 夏邑县| 上高县| 威宁| 定结县| 嘉禾县| 长丰县| 永和县| 雅江县|