マルチバイトのやりとり

IMAPでの名前がマルチバイトのフォルダについて


サーバはDovecot
クライアントはWindows7+Beccky!

で、"テスト"ってフォルダを作って、telnetコマンドでIMAPアクセスをすると、以下のように見える。

 * LIST (\HasNoChildren) "/" "&MMYwuTDI-"
 * LIST (\HasNoChildren) "/" "Trash"
 * LIST (\HasNoChildren) "/" "Sent"
 * LIST (\HasNoChildren) "/" "Drafts"
 * LIST (\HasNoChildren) "/" "INBOX"
 a OK List completed.

"&MMYwuTDI-"が"テスト"なのは分かる。
これは、

パケットキャプチャを見ると、上記文字列の部分は以下のバイトコードが対応している。

※16進数
 26 4d 4d 59 77 75 54 44 49 2d
 & M M Y w u T D I -

これは、何の文字コードなのだろう。。。。

ちなみに"テ"は、各文字コードでは以下で表される。

区 点 JIS SJIS EUC UTF-8 UTF-16 字
05 38 2546 8365 A5C6 E38386 30C6 テ

どれでもないじゃん!!

そこで、ググってみるとどうやらメールは7Bitで動くプロトコルの為、そこでUnicode文字を送信する為の文字コードとして、UTF-7というのがあるよう。

以下URLには

"7ビットでしか送信できない制限があるプロトコル上のメールやニュースなどの環境で、その体系上でUnicodeのメールを送信可能にするために作られた規格である。

現在では正しく実装されていないアプリケーション上でセキュリティー上の脆弱性を発生させることがあることから、あまり使われなくなっている。

IMAP4では、UTF-7を変更した規格である修正UTF-7の規格があり、この規格は2010年代現在においては頻繁に使用される。"

との事。この"修正UTF-7"(Modified UTF-7)ってのが重要。IMAPはこの規格にのっとっているとの事。

文字コードについて考える時は、以下のキーワードが重要

文字集合 文字の集まり(日本語、英語、unicode)
文字コード 文字と数値の対応方式
コードポイント 文字コードの数値部分
エンコード 暗号化・符号化の意味。文字コードでは文字を数値に変える事
デコード 複合化の意味。数値を文字に変える事。

→Unicodeは日本語や英語等、を一つの文字集合にしちゃおうってもの。

→文字集合に対して、その文字と数値の対応方式(符号化方式)を定めた文字コードがある。UTF7,8,16はいずれもUnicodeに対応している文字コードってこと。

では本題に戻って、UTF-7だと"テスト"は、どの数値(コードポイント?)で表されるかというと。


コード一覧表に基づいて変換ができるわけではないみたい。

IMAPのフォルダを表すのに、"修正UTF-7"ってのが使われているよう。

 ========================================================
 修正UTF-7(Modified UTF-7)はIMAP4で多言語のフォルダ名(ディレクトリ名)を使用するた めに用いられる規格である。「&」以外のASCII文字はそのまま表記する。
 それ以外の文字はUTF-16のビッグエンディアンで符号化し、修正BASE64で符号化する。
 BASE64の文字の前に「&」後ろに「-」を置く。
 「&」の文字自体は「&-」で表現する。
 ========================================================

まずは以下に注目。
・ASCII以外の文字は、BASE64される。
・BASE64される文字は、&と-で囲われている。

ってことは、今回の

 & M M Y w u T D I -

は、まず&と-を省いて考える。

 M M Y w u T D I

これをBase64の文字としてエンコードする(分からない事ばかりだ。。)

上記URLに従って変換してみる。

 M M Y w u T D I

 ①16進
 4d 4d 59 77 75 54 44 49

 ②ビット変換
 01001101 01001101 01011001 01110111 01110101 01010100 01000100 01001001

 ③6bitづつにする。
 010011 010100 110101 011001 011101 110111 010101 010100 010001 000100 1001

 ④最後が4bitになっているので0をつけて6bitにする。
 010011 010100 110101 011001 011101 110111 010101 010100 010001 000100 100100

 ⑤各ブロックをBase64の変換表に従い文字に変換(ASCIIじゃないみたい。。。)
 T U 1 Z d 3 V U R E k

 ⑥4文字づつにする。
 TU1Z d3VU REk

 ⑦最後のブロックが3文字なので、=を足す。
 TU1Z d3VU REk=

 ⑧全部くっつけるとBase64文字列との事。
 TU1Zd3VUREk=

以下コマンドで確認してみる。
# echo -n "MMYwuTDI" | base64
TU1Zd3VUREk=

あってる!感動!!!UTF7の事調べてたのに、Base64の理解度アップ!!
バイナリデータを、こうやって文字にしてたのね!base64で少しデータが増えるってのは、この
⑥で"="をくっつるから、増えるのだろう。







以下URL参照。先人達に感謝!!

→"Unicode は世界で使われる全ての文字を共通の文字集合にて利用できるようにしようという考えで作られ、Unix、Windows、Mac OS X、Plan 9[2]、Javaなどで利用されている。"

  • 最終更新:2014-12-23 20:56:37

このWIKIを編集するにはパスワード入力が必要です

認証パスワード