我的老闆向我分配了一項任務,在我們的前端網站上運行的電子郵件服務器上正確顯示所有國際字符。該網站使用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都沒有問題顯示國際字符,所以我想知道他們如何儘可能地解決這類問題。
這似乎是合乎邏輯的事情。一旦我確切地知道我正在使用哪個字符集(我很確定在ASP中有一個內置的功能可以輕鬆地轉換編碼),轉換是非常直接的,但是,找出電子郵件組成的字符集仍然要求我徹底檢查在假想的parseMailHeaders函數內嵌入到我的郵件頭中的所有可能的字符集。後一個過程正是我想要避免的。我想知道你是否可以在這個問題上提出一些看法。謝謝! – l46kok
不確定您的意思是「徹底檢查」。你會從郵件頭中提取字符集的值,並檢查你的編碼庫是否支持這個字符集。如果電子郵件標題中的值和編碼的內部名稱不同,則只需詳盡交叉引用各個值。我承認我不知道這個ASP API,但是你能不能簡單地將一個編碼名稱作爲一個字符串放在一個函數中,它會告訴你它是否支持這種編碼? – deceze
我對ASP的淺層理解告訴我不,這是不可能的,因爲在ASP API中沒有等效的「tryEncodingConvert」,所以它不是在convert函數中作爲字符串提供的字符集,就是整個頁面失敗。雖然我可能是錯的,但我想通過知道的人得到確認。 – l46kok