2

メールの本文に貼り付けられたログファイルを読んでいると、いくつかはさまざまな言語で書かれており、ロシア語を除いてすべての言語の文字が正しく表示されているようです。

これは、ロシア語がログファイルで言っていることの例です。

Ссылканаобъектнеуказываетнаэкземпляробъекта。

в

私が読んだことから、mb_encoding(UTF-8)の行で何かをデコードまたはエンコードすることを指定する必要がありますが、ロシア語ではないコードに影響を与えずに実際に構造化する方法に少し迷っています。しかし、エコーアウトされると、次のように変換されます。

СÑылканаобъекÑ、неукаÐ・ываеÑ、наеÑ、наÑкРв

これがすでに使用しているコードです。私はphpの初心者であり、これの一部は私のコードではありません。私はそれに合わせて編集しましたが、すべてが何をしているのか100%ではありません。

$mailbox = "xxx@gmail.com";
$mailboxPassword = "xxx";

$mailbox = imap_open("{imap.gmail.com:993/imap/ssl}INBOX",
                     $mailbox, $mailboxPassword);

mb_internal_encoding("UTF-8");
$subject = mb_decode_mimeheader(str_replace('_', ' ', $subject));

$body = imap_fetchbody($mailbox, $val, 1);
$body = base64_decode($body);

echo $body;

echoが体を外すと、それはロシア語からそのエンコーディングに変換されます、これを修正する方法を学ぶために私が分析できる同様のコード上のポインタはありますか?

電子メールから読み取られる言語は多数あることを覚えておいてください。ほとんどの場合、そのスニペットはほんの数個で、残りは基本的なロギングですが、新しいデコードを設定すると、他の言語の文字が台無しになるのではないかと心配しています。

4

1 に答える 1

2

広く採用されているにもかかわらず、電子メールは依然として扱いにくいものです。IMAP クライアントの要件が限られている場合、作業は簡単です。それ以外の場合、本当に汎用的な GMail クライアントの場合、特効薬はなく、SMTP、MIME、そして最後に IMAP という電子メールの仕組みを理解する必要があります。

基本的な MIME の知識は絶対に必要です。ウィキペディアの記事全体を貼り付けるつもりはありませんが、実際に読んで、それがどのように機能するかを理解する必要があります。IMAP の方がやや理解しやすいです。

通常、電子メール メッセージには、単一のtext/plain本文、またはtext/plain部分とtext/html部分の両方を含むmultipart/alternative body が含まれます。しかし、ご存知のとおり、添付ファイルがあるため、multipart/mixedも見つかる可能性が高く、実際には何でも含むことができます。バイナリ コンテンツの場合は、テキストとは異なる方法で処理する必要があります。2 つのヘッダー (グローバルメッセージ内またはマルチパート エンベロープ内の一部で見つけることができます) は、文字セットの問題に多少関連しています: Content-TypeContent-Transfer-Encodingです。

コードから、 base64 でエンコードされたテキスト部分のみに関心があると想定する必要があります。それらをデコードすると、送信者がContent-Typeヘッダーで指定した文字セットでテキストを表す一連のバイトになります。これはここでは非 ASCII であるため、次のようになります。

Content-Type: text/plain; charset=ISO-8859-1

charsetutf8か、実際には考えられる他のものである可能性があることに注意してください。プログラムでこれを確認する必要があります。あなたの仕事は、この入力を HTML ページの出力文字セットに変換することです。ページが Unicode エンコーディング (UTF-8 など) を使用していない場合、メッセージを正しく表示することさえできない可能性があります。欠落文字の代わりに印刷されます。アプリケーションを (ロシアだけでなく) 世界中で使用する必要があり、いずれにせよ良い習慣であるため、HTML 応答で UTF-8 を使用する必要があります。

echo mb_convert_encoding(imap_base64($body), "UTF-8", $input_charset);

ここで、処理された部分$input_charsetContent-Typeヘッダーにあるものです。件名にはimap_mime_header_decode()、上記と同じ方法で出力する必要があるタプル (バイナリ文字列、文字セット) の配列を返す を使用する必要があります。

TL;DR

CP-1252でエンコードされていると仮定すると、UTF-8 でエンコードされた入力テキストのバイトは、出力に非常にうまくマップされます(印刷できないものをコピーしなかった可能性があります)。これは、入力は UTF-8 ですが、ブラウザーはページが Windows-1252 であると認識していることを意味します。おそらくこれは、お使いのロケールのデフォルトのブラウザー動作であり、他の入力の前に適切なヘッダーを送信することで簡単に修正できます。

header("Content-Type: text/html; charset=utf-8");

これはこの問題を解決するのに十分なはずですが、文字列リテラルとデータベース (存在する場合) の非 ASCII 文字で問題が発生する可能性もあります。多言語アプリケーションが必要な場合は Unicode が適していますが、データベースと PHP ファイルを CP-1252 から UTF-8 にトランスコードする必要があります。

于 2012-12-31T11:04:50.973 に答える