0

上司から、フロントエンドWebサイトで実行されている電子メールサーバーにすべての国際文字を正しく表示するタスクが割り当てられました。Webサイトは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)

上記のコードはまったくエレガントではないと言っても過言ではありませんが、ほとんどの場合、それで作業は完了します。これは韓国語のWebサイトであるため、コードは非ユニコードであるが韓国語で書かれたヘッダーを探しています。それ以外の場合は、受信した電子メールがUTF-8であると想定します。

したがって、UTF-8以外の文字セットを含むメールがあり、コード内に定義されている韓国語のコードページがある場合は常に、解析されたテキストがすべて乱雑になります。

上司から「メールの内容にすべての国際文字を表示させる」と言われたので、ここに記載されているヘッダーに含まれるすべての文字セットを徹底的にチェックし、コードページを適切に設定するしか考えられません。良い解決策ではないようです。

ここで実際的なアプローチはどうなるのだろうかと思います。hotmailやgmailなどの多くのメールサービスは国際文字の表示に問題がないので、可能であれば、この種の問題にどのように対処したかを知りたいと思います。

4

1 に答える 1

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でエンコードされており、そのように扱うことができます。

于 2012-11-27T08:20:47.650 に答える