2

コマンドIMAP SEARCH CHARSETを使用して IMAP サーバーで検索しているときに、どのエンコーディング アプローチがTunderbirdを使用するのか理解できません

ロシア語の単語「привет」を検索しようとしましたが、これは「?@825B」にマップされました。

A001 SEARCH CHARSET ISO-8859-1 BODY "?@825B"

それはどのように起こりますか?私はスニファーを使用してこれをキャッチし、Dovecotサーバーは「привет」という単語を含むメールを正しく検出したため、これは正しいと確信しています。ISO-8859-1 エンコーディングには、ロシア語のグリフがまったくありません! では、どのように変換されたのでしょうか。

たとえば、"привет" (Unicode 文字で書かれている) は"??????" となります。私のマシンまたはここでのISO-8859-1エンコーディングの場合http://www.motobit.com/util/charset-codepage-conversion.asp

4

1 に答える 1

0

Thunderbird がこの値を取得する方法は、(16 ビット?) Unicode 文字をバイトにダウンキャストすることです。

たとえば、C# (char 型と string 型に内部的に UTF-16 を使用する) では、次のような結果が得られます。

const string text = "привет";

var buffer = new char[text.Length];
for (int i = 0; i < text.Length; i++)
    buffer[i] = (char) ((byte) text[i]);

var result = new string (buffer);

Thunderbird がサロゲート ペアをどのように処理するかは、質問からわかったことに基づいて誰でも推測できます。サロゲート ペアを (上記のコードのように) 2 つの別個の文字として扱うか、それらを 32 ビットの Unicode 文字に結合し、それをバイトにダウンキャストします。

于 2019-09-21T11:37:12.133 に答える