VMime Book 日本語訳 第4章 4.8

VMime Book 日本語訳 第4章 4.8
2020-07-01 K.OHWADA

原文
VMime Book: A Developer’s Guide To VMime
https://www.vmime.org/public/documentation/book/vmime-book.pdf

全体目次

第4章 基本

Basics

4.8 ヘッダーフィールドの非ASCIIテキスト

Non-ASCIItextinheaderfields

MIME標準では、特にヘッダーフィールドで、7ビットのみではないデータ(つまり、ASCII文字セット)を処理するためのmethods が定義されています。
たとえば、フィールド「Subject:」はこのデータ型を使用します

VMime は RFC-2047 と完全に互換性があり、8ビットデータを操作するための2つのオブジェクト vmime :: textとvmime :: word を提供します。
単語は、指定された文字セットでエンコードされたテキスト情報を表します。
テキストは1つ以上の単語で構成されます

RFC-2047は、8ビットデータを7ビット形式にエンコードするプロセスについて説明しています。
基本的に、Base64およびQuoted-Printableエンコーディングに依存しています。
うまくいけば、すべてのエンコード/デコードプロセスはVMimeによって内部的に行われるため、テキストオブジェクトの作成は非常に簡単です。

リスト4.12:vmime :: textオブジェクトの作成
Creating vmime::text objects

vmime::string inText = "Linux dans un =? UTF -8?B?dMOpbMOpcGhvbmUgbW9iaWxl ?=" ; 

”Linux dans un tAclAcphone mobile”;
vmime::charset inCharset = ”utf−8”; vmime::text outText;
outText.createFromString(inText, inCharset);
// ’outText’ now contains 3 words:
// . <us−ascii>
// . <utf−8>
// . <us−ascii>
”Linux dans un ”  ̃ ̃
”tÄclAcphone ” ”mobile”
vmime::shared ptr <vmime::header> header = myMessage−>getHeader(); header−>Subject()−>setValue(outText);

一般に、プロセスはVMimeで完全に透過的であるため、RFC-2047でエンコードされたデータをデコードする必要はありません。
本当に必要な場合は、vmime :: text :: decodeAndUnfold()静的メソッドを使用して、エンコードされたデータからテキストオブジェクトを作成できます。

たとえば、次のエンコードされたデータがあるとします。

Linux dans un =?UTF-8?B?dMOpbMOpcGhvbmUgbW9iaWxl?=

次のコードを使用して簡単にデコードできます。

リスト4.13:RFC-2047でエンコードされたデータのデコード
Decoding RFC-2047-encoded data

vmime::string inData =
”Linux dans un =?UTF−8?B?dMOpbMOpcGhvbmUgbW9iaWxl?=”; vmime::text outText;
vmime::text::decodeAndUnfold(inData, &outText);

vmime :: textは、1回の呼び出しですべての単語を別の文字セットに変換する関数も提供します。
次の例は、メッセージの件名フィールドに格納されているテキストを変換する方法を示しています。

リスト4.14:vmime :: textのデータを指定された文字セットに変換する
Converting data in a vmime::text to a specified charset

vmime::shared ptr <vmime::message> msg; // we have a message 
vmime::text subject = msg−>getHeader()->Subject()->getValue();
const vmime::string subjectText = subject.getConvertedText(vmime::charset("utf−8") );
// ’subjectText’ now contains the subject in UTF−8 encoding
``