2012-11-27 66 views
0

我的老闆向我分配了一項任務,在我們的前端網站上運行的電子郵件服務器上正確顯示所有國際字符。該網站使用asp-classic。確定電子郵件字符集

我看着我們的mail_body.asp代碼,看看服務器是如何處理文本文件從POP3接收,這是我發現:

Set bobj = Server.CreateObject("Basp21") 
If InStr(UCase(filecontent),"?UTF-8?") > 0 or InStr(UCase(filecontent),"CHARSET=""UTF-8""") > 0 Then 
    bobj.CodePage = 65001 
ElseIf InStr(UCase(filecontent),"EUC-KR") or InStr(UCase(filecontent),"KS_C_5601-1987") > 0 or InStr(UCase(filecontent),"CONTENT-TRANSFER-ENCODING: BASE64") > 0 Then 
    bobj.CodePage = 949 
    'response.Write "euc-kr" 
    'response.Write "UTF-8" 
ElseIf InStr(UCase(filecontent),"CHARSET=JOHAB") > 0 Then 
    bobj.CodePage = 1361 
    'response.Write "JOHAB" 
ElseIf InStr(UCase(filecontent),"CHARSET=X-MAC-KOREAN") > 0 Then 
    bobj.CodePage = 10003 
    'response.Write "X-MAC-KOREAN" 
ElseIf InStr(UCase(filecontent),"CHARSET=X-EBCDIC-KOREANEXTENDED") > 0 Then 
    bobj.CodePage = 20833 
    'response.Write "X-EBCDIC-KOREAN" 
ElseIf InStr(UCase(filecontent),"CHARSET=ISO-2022-KR") > 0 Then 
    bobj.CodePage = 50225 
    'response.Write "ISO-2022-KR" 
ElseIf InStr(UCase(filecontent),"CHARSET=""GB2312""") > 0 or InStr(UCase(filecontent),"CHARSET=GB2312") Then 
    bobj.CodePage = 936 
Else 
    bobj.CodePage = 65001 
End If 

... 
outarray=bobj.ReadMail(contents,"subject:to:from:date:X-OriginalArrivalTime:",dirname) 

我認爲這是肯定地說,上面的代碼是不優雅,但它大部分完成工作。這是一個韓國網站,因此代碼正在尋找非Unicode的頭文件,但是用韓文編寫。否則,它假定收到的電子郵件是UTF-8。

因此,只要有字符集以外的字符集與UTF-8以及代碼中定義的任何韓語代碼頁一起被分析的文本都會混亂起來。

因爲我的老闆要求我「讓電子郵件內容顯示所有國際字符」,我能想到的唯一解決方案是exhaustively check for all character sets listed here which the header can contain,並適當地設置了代碼頁,但這似乎不是一件好事解。

我想知道在這裏採取什麼樣的實用方法。許多電子郵件服務如hotmail和gmail都沒有問題顯示國際字符,所以我想知道他們如何儘可能地解決這類問題。

回答

2

實用的方法是解析出charset=*的值並將內容轉換爲統一的內部編碼。僞代碼(因爲我不是一個ASP人都沒有):

charset = parseMailHeaders(mail.headers, 'charset') // e.g. 'ISO-2022-KR' 
mailBody = convertEncoding(charset, 'UTF-16', mail.body) 

假想parseMailHeaders提取的charset=*從相應的郵件頭中的價值。根據您的假設convertEncoding函數接受的值,您可能需要對提取的charset值進行一些歸一化處理,但基本上就是這樣。從那時起,你就知道內容是UTF-16編碼的,可以這樣對待它。

+0

這似乎是合乎邏輯的事情。一旦我確切地知道我正在使用哪個字符集(我很確定在ASP中有一個內置的功能可以輕鬆地轉換編碼),轉換是非常直接的,但是,找出電子郵件組成的字符集仍然要求我徹底檢查在假想的parseMailHeaders函數內嵌入到我的郵件頭中的所有可能的字符集。後一個過程正是我想要避免的。我想知道你是否可以在這個問題上提出一些看法。謝謝! – l46kok

+0

不確定您的意思是「徹底檢查」。你會從郵件頭中提取字符集的值,並檢查你的編碼庫是否支持這個字符集。如果電子郵件標題中的值和編碼的內部名稱不同,則只需詳盡交叉引用各個值。我承認我不知道這個ASP API,但是你能不能簡單地將一個編碼名稱作爲一個字符串放在一個函數中,它會告訴你它是否支持這種編碼? – deceze

+0

我對ASP的淺層理解告訴我不,這是不可能的,因爲在ASP API中沒有等效的「tryEncodingConvert」,所以它不是在convert函數中作爲字符串提供的字符集,就是整個頁面失敗。雖然我可能是錯的,但我想通過知道的人得到確認。 – l46kok