我的老板指派我在我们的前端网站上运行的电子邮件服务器上正确显示所有国际字符的任务。该网站使用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)在显示国际字符方面都没有问题,所以我想知道他们如何处理这类问题。
答案 0 :(得分: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编码的,可以这样处理。