接收Email之eml文件解析后亂碼探討
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
當我們瀏覽網頁、打開文檔或郵件,運行軟件時,經常會看到亂碼,通常是由于源文件編碼,Windows不
能正確識別造成的的,也可能是其他原因。亂碼給我們帶來了太多的煩惱,為了幫助大家徹底擺脫亂碼 ,下面我們就來探討一下亂碼的形成原因及其消除方法。 一、亂碼有五種類型 常見的亂碼,一般可以分成五種類型:第一類是文本/文檔文件亂碼,這一般是由于源文件編碼,與 Windows使用的編碼不通用造成的;第二類是網頁亂碼,形成原因與第一類亂碼類似;第三類是Windows 系統界面亂碼,即中文Windows的菜單、桌面、提示框等顯示亂碼,主要是Windows注冊表中有關字體的 部分設置不當引起的;第四類是應用程序的界面亂碼,即各種應用程序(包括游戲)本來顯示中文的地 方出現亂碼,形成原因比較復雜,有第二類的亂碼原因,也可能是軟件用到的中文鏈接庫,被英文鏈接 庫覆蓋造成的;第五類是郵件亂碼,形成原因也極其復雜。 二、如何消除應用程序的界面亂碼? 目前有些軟件發行了Unicode版本,這是一種通用的字符編碼標準,涵蓋了全球多種語言及古文和專 業符號,這種版本的軟件運行在任何系統和語言上都不會亂碼,如果是非Unicode編碼的程序,就會有亂 碼現象。 【形成原因】:原因有三種。如果是由于Windows注冊表中關于字體設置的信息不正確造成的,你可 以用下面“如何消除Windows系統界面亂碼”介紹的辦法去解決;如果用上法解決不了,那就可能是由于 軟件的中文鏈接庫,被英文鏈接庫覆蓋而引起的。這種現象經常發生在用微軟開發工具例如VB、VC開發 的中文軟件上,這類軟件中,菜單等顯示界面上的漢字都是受一個動態鏈接庫(DLL文件)控制,而軟件 的這個動態鏈接庫一般安裝在WindowsSystem目錄下,如果以后安裝了某個英文軟件也使用同名的動態鏈 接庫,則英文軟件的動態鏈接庫就會覆蓋中文鏈接庫,這樣,運行中文軟件時就會調用英文的動態鏈接 庫,因此出現亂碼。解決辦法:重新安裝中文軟件,恢復中文動態鏈接庫即可。 如果以上方法也無濟于事,對于Win9X/ME系統,你可以安裝使用MagicWin98(下載地址 http://www.skycn.com/soft/3047.html)、南極星等內碼轉換軟件,轉換內碼后即可消除亂碼;對于 WinXP系統,建議使用微軟多語言支持工具MicrosoftAppLocale(下載地址 http://www.skycn.com/soft/12582.html),利用它為指定程序設置相應的語言區域,這樣也可消除亂 碼。 三、如何消除文本/文檔文件亂碼? 【形成原因】:一般是由于文檔采用的字符集,系統不支持造成的。例如繁體中文的文檔顯示在簡 體中文系統下,或者相反的情況,就會造成文檔顯示時亂碼。只要你內碼轉換正確,例如把原本是繁體 的內碼,轉換為簡體內碼(或者相反),即可消除亂碼。 【解決辦法】:有以下四種解決辦法: 1、使用Word2003/XP轉換內碼 Word2003/XP支持眾多的語言,可以正確顯示非Unicode類型的文本文件,單擊“工具”菜單下的“ 語言”/設置語言,你可以把默認語言設置成非中文,例如日語,這樣Word就可以正確顯示日文了。 當然你也可以用它進行簡體中文與繁體中文之間的轉換工作,如果文件有亂碼,你轉換一下即可消 除。例如要把繁體中文轉換為簡體中文,方法是:選擇要轉換內碼的文件,在彈出的對話框中(如下圖 ),選擇“其他編碼”中的“繁體中文(BIG5)”一項,打開此文件時就不會出現亂碼。
在Word2003/XP中,當保存時選擇“文件”中的“另存為”,先存為“WORD”文檔,存盤后打開再存 為純文本等其他格式;或者在菜單欄中選擇“工具/語言/中文簡繁轉換”,內碼轉換以后再保存。 3、使用內碼轉換工具 除此之外,使用內碼轉換工具也可以消除此類亂碼,你只要對BIG5(繁體中文)和GB2312(國標碼 、簡體中文)進行相互轉換即可實現。常用的內碼轉換工具有:
文件時對內碼進行轉換。 【形成原因】:網頁亂碼是瀏覽器(IE等)對HTML網頁解釋時形成的,如果網頁制作時編碼為A,瀏 覽器卻以編碼B顯示該網頁,就會出現亂碼,因此只要你在瀏覽器中也以編碼A顯示該網頁,就會消除亂 碼。 例如網頁的代碼中有形如:〈HTML〉〈HEAD〉〈META CONTENT=“text/html;charset=ISO-8859-1 ”〉〈/HEAD〉的語句,瀏覽器在顯示此頁時,就會出現亂碼,因為瀏覽器會將此頁語種辨認為“歐洲語 系”。 【解決辦法】:有以下四種解決辦法: 1、在瀏覽器中選擇“編碼”菜單 事先為瀏覽器安裝多語言支持包(例如在安裝IE幣?安裝多語言支持包),這樣當瀏覽網頁出現亂碼 時,即可手工更改此類網頁的編碼方式,在瀏覽器中選擇菜單欄下的“查看??“編碼”/“自動選擇”/ 簡體中文(GB2312),如為繁體中文則選擇“查看”/“編碼”/“自動選擇”/繁體中文(BIG5),其他 語言依此類推,選擇相應的語系,這樣便可消除網頁亂碼現象。 2、修改網頁代碼 用FrontPage等軟件打開出現亂碼的網頁,修改該網頁代碼,在以下句子中 〈META CONTENT=“text/html;charset=ISO-8859-1”〉,將語種“ISO-8859-1”改為GB2312,如 果是繁體網頁則改為BIG5。 3、無亂碼保存網頁 用瀏覽器打開該網頁,在“查看”/“編碼”中選擇“自動選擇”,存盤時保存類型選“WEB頁”, 編碼選擇“UNICODE”,這樣保存過的網頁再次打開時,在瀏覽器菜單“查看”/“編碼”中不管選擇簡 體中文(GB2312)、簡體中文(HZ)還是UNICODE(UTF-8)或繁體中文(BIG5),最終顯示都不會出現 亂碼。 4、使用多內碼顯示軟件 使用多內碼顯示軟件來轉換內碼,也可以消除亂碼。常用多內碼顯示軟件有:
【形成原因】:這類亂碼是由于Windows注冊表中關于字體部分配置不正常造成的,即使您用內碼翻 譯軟件(如南極星、MagicWin98等)處理也不會消除。 【解決辦法】:在Windows注冊表中,恢復關于字體部分的正確設置。 1、利用顯示正常的電腦 假如有一臺Windows版本相同、顯示正常的電腦可以利用,你可以如下步驟進行恢復:在正常機器上 選擇“開始”/“運行”,在對話框中鍵入“REGEDIT”,打開注冊表編輯器;光標定位到 “HKEY_LOCAL_MACHINESYSTEMCURRENT CONTROL SETCONTROLFONTASSOC”,選擇“注冊表/導出注冊表文 件”,選擇“分支”,導出該分支注冊表信息到文件(如LI.REG)中(如下圖);把LI.REG文件COPY到 顯示亂碼的機器上,在顯示亂碼機器上運行REGEDIT,選擇“注冊注冊表”/“導入注冊注冊表”,把 LI.REG文件導入注冊表中。
如果沒有顯示正常的電腦可以利用,就需要您手工恢復字體部分注冊表項,方法有以下兩種: 第一種方法:用記事本編輯一個文件,然后保存為擴展名“REG”(文件名隨意),再用鼠標右鍵單擊 這個文件,在右鍵菜單中選擇合并,即可完成對注冊表的改動。該文本文件的內容如下: REGEDIT4 [HKEY_LOCAL_MACHINESystemCurtentControlsetcontrolfontassoc]?? [HKEY_LOCAL_MACHINESystemCurtentControlsetcontrolfontassocAssociated DefaultFonts]?? "assocSystemFont"="simsun.ttf" "FontPackageDontCare"="宋體" "FontPackageRoman"="宋體" "FontPackageSwiss"="宋體" "FontPackageModem"="宋體" "FontPackageScript"="宋體" "FontPackageDecorative"="宋體" [HKEY_LOCAL_MACHINESystemCurtentControlsetcontrolfontassocAssociated CharSet]?? "SYMBOL(02)"="no" "OEM(FF)"="yes" "GB2312(86)"="yes" “HKEY_LOCAL_MACHINESYSTEMCURRENT CONTROL SETCONTROLFONTASSOC”,正常情況下會有ASSOCIATED DEFAULTFONTS、ASSOCIATED CHARSET兩個文件夾,這些文件夾中正確的參數如下表所示: 當出現漢字亂碼時,上述兩個文件夾中內容就會不完整,有的沒有ASSOCIATED CHARSET文件夾、或其中 內容殘缺不全;有的ASSOCIATED DEFAULTFONTS下內容殘缺。只要你打開注冊表,在 “HKEY_LOCAL_MACHINESYSTEMCURRENTCONTROLSETCONTROLFONTASSOC”下,根據以上正確內容恢復即可。 六、如何消除郵件亂碼? 郵件亂碼的形成原因很多,主要有以下幾個方面,針對以下幾種形成原因,應該采取不同的亂碼消 除方法: 1、收發信雙方的語種不同導致的 收發雙方使用的操作系統的不同,可以造成亂碼。比如發件人使用的是日文的Windows,而收件人使 用的是簡體中文的Windows,這樣的郵件當然會造成亂碼。對于中文電子郵件,如果收信方所用的操作系 統是英文環境、而且沒有外掛中文系統或未切換為中文(如南極星等)編碼方式,也會無法看到中文、 只可見亂碼。所有的雙字節字符(如中文簡/繁體的GB和BIG5碼及日文的JIS、EUC和朝鮮文的 KSC碼等) 在非本語種操作系統下都會出現亂碼;同樣在中文簡體的GB碼環境下,看其他雙字節字符時也只能看到 亂碼。 【解決辦法】:安裝多語言支持包或使用多內碼顯示平臺(如南極星等),對收到的郵件,根據其 使用的語種切換到相應的編碼方式即可消除亂碼。 2、發信服務器不支持8位(非ASCII碼格式)傳輸 郵件傳輸機制或郵件編碼的不同,可能造成郵件服務器不支持8位(非ASCII碼格式)傳輸而形成郵 件亂碼。例如直接發送中文或二進制等非ASCII碼格式的郵件(如中文雙字節文件、圖片文件.jpg、可執 行文件.exe或壓縮文件.zip等二進制文件)時,郵件服務器有可能無法處理,便把信件中每個字符的第 八位都過濾掉,從而造成郵件信息的失真或損壞,在收到郵件時就是一堆亂碼。 【解決辦法】:只能由發件人解決。當發送8位格式的文本文件時,必須事先進行編碼,將文件轉換 為7位ASCII碼或更少位數的格式,然后才能保證文件的正確傳送。收件人收到7位或更少位格式的郵件后 ,可以再轉換為8位的格式,這樣就可避免亂碼。 3、收發端用的EMAIL軟件和設置不同 一般EMAIL軟件的"附件"功能都可以自動對信件先進行編碼,然后送出。這樣只要收信人使用的 EMAIL軟件(如Outlook XP等)能區別信件的編碼方式,即可自動將信件解碼。如果收發件人所用的 EMAIL軟件默認配置不同、收發件人自己定制的一些選項不同,在收到編碼的信件后,系統就未必能識別 出信件所用的編碼方法,自然也無法自動解碼,這樣就會出現亂碼。 【解決辦法】:如果你用OE收中文郵件,看到的是一篇亂碼,可以查一下“查看”-“編碼”下, 是否選了“簡體中文(GB2312)”,選對了就不會有問題。 此外,你也可以用Winzip IE來解碼,方法是:把亂碼郵件的內容,拷貝到剪貼板中,然后將其粘貼 到記事本中,存為文本文件(例如LI.txt),再將其后綴改為.uue(改為LI.uue),點擊此文件,會啟 動Winzip,然后啟動IE,把Winzip中的001.txt文件拖到IE窗口中,就會顯示郵件原來的內容,而不會看 到亂碼。 郵件的編碼方式主要有:Uuencode、Base64 encode、QP-encode、BINHEX等。如果Email軟件不能 識別郵件的編碼方法,就會顯示郵件時出現亂碼。因此,你可以根據郵件中的關鍵字符判斷編碼方法, 選取合適的解碼軟件進行解碼。 (1)、QpencodeQP編碼 該編碼全稱“Quoted-Printable Content-Transfer-Encoding”,因為這種格式郵件的內容都是 ASCII字符集中可以打印的字符,所以名稱中含有printable。大體格式為: =A1A=B1z=A6n=A1I=A7=DA=A6b=BA=F4=B8=F4=A4W=B1o......=E5==ABH=A5=F3=B0=DD=C3D=B1M=Aea=A1A... ... 特征:內容通常有很多等號"=",因此不需要看"信頭"也可以判斷是否為QP編碼。 解碼辦法:把郵件中類似A1A=B1z=A6n…的部分編碼全部復制下來,貼到一個新的純文本文件中,然 后在文件頭部加入Quoted-pintable格式的文件頭: Contenet-Type:text/plain;Charset=”GB2312” Content-Transfer-Encoding;Quoted-pintable 然后以“EML”為后綴保存文件,用資源管理器雙擊打開文件即可顯示正確的內容。如果還有部分漢 字亂碼,可以用WINZIP對存盤后的EML文件進行解壓,即可看到正確的內容。 (2)MIME/BASE64 encode編碼 該編碼方式將3個字節(8位)用4個字節(6位)表示,由于編碼后的內容是6位的,因此可避免第8 位被截掉,大體格式為: MIME-Version:1.0 Content-Type:text/plain; charset="us-ascii" Content-Transfer-Encoding:base64 Status:R SGmhQbF6pm6hSafapmK69Lj0pFexb6q+sXqsT6Skp OWrSKXzs N3DRLFNrmGhQQ0Kq1+sTqq6vdCx F6p9qoz6XOIE1Py3Jvc29mdCuiBJbnRlcm5ldCBN......。 特征:亂碼前一般有如下幾部分"信頭":Content-Type(內容類型)、charset(字符集)及Content- Transfer-Encoding(內容傳輸亂碼方式)。 解碼辦法:用EMAIL軟件,選擇編碼中BASE64 選項就可解碼,解碼后會消除亂碼。 (3)、BINHEX編碼 這種編碼方式大體格式為: (This file must be converted with Binhex4.0)SGmhQbF6pm6hSafapmK69Lj0pFexb6qss Tqq6vdCx 解碼辦法:用EMAIL軟件對它解碼;也可在EMAIL軟件中保存亂碼郵件,存為后綴為“.HQX”格式的 文件,然后用WINZIP解碼展開。解碼后會消除亂碼。 (4)、UTIF-7/UTIF-8編碼 它們是UNICODE的兩種轉換碼。
這是UNIX環境下使用的編碼方式,目前已經很少用,大體格式為: begin 644 kk.zip M1G)O;2!I;&EN+F)B3T!C(VEE+FYC=‘4N961U+G1W(%=E9"!.;W8@(#8@,3 (ZM,SDZ,C4@,3DY-@I296-E:79E9#H@9G)O;2!F;&%B;6%I;"YF;&%B+F9U:FET.................。 end 特征:亂碼前面含有"begin xxx",后面是編碼前的原始文件名(如kk.zip);接著是已經過編碼的 信件內容(如上述的亂碼部分);最后一行為"end" 解碼辦法:可用BECKY!EUDORA等EMAIL軟件,選擇編碼中相應的選項就可解碼;也可以在EMAIL軟件 中保存亂碼郵件,存為后綴為“.UUE”格式的文件,然后用WINZIP解碼展開,解碼后就會消除亂碼。 七、發信方如何避免產生亂碼郵件? 為了避免別人收到亂碼,發信方應該采取以下的措施: 1、設定默認自動為7位編碼 在郵件客戶端軟件中的書寫(撰寫)選項中,設定默認自動為7位編碼。因為當你發送 8位格式的文 本文件時,必須事先進行編碼,將文件轉換為7位ASCII碼或更少位數的格式,然后才能保證文件的正確 傳送。收件人收到7位或更少位格式的郵件之后,可以再轉換為8位的格式,這樣就可以閱讀了。 2、發送前在簽字欄中注明使用的漢字編碼 發送中文郵件前,最好在固定的簽字欄中注明自己所使用的漢字碼標準(例如GB2312、中文HZ、GBK 等);港澳臺及東南亞地區郵件作者在使用BIG5 碼撰寫完郵件、向內地發送前,要轉換成上述三種簡體 國標碼中的一種形式、并在簽字欄中注明。如不轉換則可能無法閱讀,因為國內用戶使用的郵件系統有 很多不支持BIG5碼。 3、正確設置EMAIL軟件 選擇優秀的Email收發軟件可以有效地解決郵件亂碼。如果使用Outlook 2003/XP,應在軟件中把“ 簡體中文(GB2312)作為默認的郵件使用語言,選擇“國際設置”/為接收的所有郵件使用默認的編碼。 如果使用英文EMAIL軟件,應設置成:文字設定DEFAULT CHARSET:ISO 8859-1(LATIN1);編碼方 式ENCODING:QUOTED-PRINTABLE,不可選擇7位(因為7位不支持中文);字碼頁CODE PAGE(可選): 936或HZ-GB-2312,以支持整字識別;郵件格式:MIME;字體:宋體 如果使用其他中文EMAIL軟件,應設置成:文字設定DEFAULT CHARSET:簡體中文GB2312;編碼方式 ENCODING:QUOTED-PRINTABLE;郵件格式:MIME;字體:宋體 4、發送重要信息時先發測試信 發送重要信息時,為了確認是否無須編碼即可發送正文,應該先發送測試信。而且還應確定收件人 能否對附件文件進行解碼。如果發送已經編碼的郵件,則最好添加足夠的“信頭”信息,以便收件人知 道所需的解碼方法。建議對uuencode/UUDeview編碼方式用uuencoding作信頭,對mpack編碼方式用 base64 encoding作信頭。 如果發/收件人之間遠隔萬里,則傳送過程中,第八位將可能被截掉。這時最好先在正文中用中文給 收件人發一封測試信,并了解對方能否正確收到郵件正文。如果第八位被截掉,則收件人將會看到一些 亂碼,而不是上述的uu/b64/Qp等格式,而且這種信件幾乎不可恢復。 對策:在Netscape、Eudora或Pegasus Mail等你所使用的郵件系統中,選擇其首選項或選項配置中 的"Quoted Printalbe"或"MIME encoding 5、盡量利用“附件”功能發送文件 幾乎所有的郵件軟件,如Netscape、The Bat!、 Becky! 等郵件系統附加這類非標準 ASCII碼格式 的文件時,附加文件通常可以自動進行“base64”方式編碼(僅對附件部分進行編碼)。在用"附件"方 式發送郵件之前,無需進行編碼;否則適得其反。因為郵件軟件能夠自動成功解碼這類“附加”文件, 因此在發送中文類郵件時應該首選這種方法。 如果無法以附件方式發送文件,則必須在正文中發送中文或二進制文件 八、收信方如何避免郵件顯示亂碼? 收信方應該首先查找郵件的簽字欄或正文中,有無指明對方使用的漢字編碼類別;然后在Outlook XP“視圖”菜單下選中“編碼”,隨后將出現全部的漢字編碼,在其中選擇郵件所指明的一種。 如果收到的郵件中沒有指明所用的漢字編碼,則可以順序單擊選擇編碼,直到郵件正文顯示正確為 止。如果你使用的是Netscape,則可在 Option菜單下的Document Encode中選擇相應的項目。 九、在跨語種操作系統間收發電子郵件,如何保證不會亂碼? 如果對方使用非中文系統,你給他發中文郵件時,他打開你發的中文郵件,就會出現亂碼。解決辦 法有兩種: 1、用繪圖軟件書寫中文郵件 用畫筆等繪圖軟件書寫中文郵件,然后把中文郵件以GIF圖形格式保存,最后壓縮之、作為郵件附件 發送。 運行繪圖軟件,在圖片中輸入文字,用GIF格式保存,將屬性置為黑白模式(以減少圖片體積),然 后用WINZIP把它壓縮成ZIP格式,作為附件在郵件中發送,這樣不管對方在何語言平臺下,都不會出現亂 碼,收信人不必去下載PDF文件閱讀器,閱讀起來也很方便。 2、使用專門的工具轉換和閱讀 EMAIL AID之類的工具可以把中文郵件轉換為AID格式文件,你把該格式文件發給對方,他再用EMAIL AID打開觀看即可。 EMAIL AID(UCWIN GOLD 1.0附帶的)可以把文本文件轉換為AID格式文件,大小只比原TXT文件增加 幾K。寫好中文郵件后,用文本格式存盤,然后你運行EMAIL AID,以AID格式保存,最后你把AID文件連 同EMAIL AID軟件一起作為附件插在信中。對方收到信后,只需運行EMAIL AID,打開AID格式文件即可看 到漢字,不管對方在何種語言平臺下,都不會出現亂碼。 該文章在 2012/1/12 23:41:11 編輯過 |
關鍵字查詢
相關文章
正在查詢... |