• ベストアンサー

インターネットヘッダ内の日本語のエンコード/デコード

電子メールの件名やあて先など、日本語を使うと、 インターネットヘッダ内では、例えば以下のような ASCII文字にエンコードされていますが、 =?iso-2022-jp?Q?=1B$BEE;R%a!<%k$N7oL>?= これはどんな規則でエンコードされているのでしょうか。 つまり、メーラを使わずに手操作でデコードしたいのですが、 どのような手続きをとれば、日本語(シフトJISなど)に 変換できるのでしょうか? あるいは、フリーの変換ソフトなどがあれば、教えていただきたく 思っています。

  • JF1Msf
  • お礼率56% (201/354)

質問者が選んだベストアンサー

  • ベストアンサー
  • MtHill
  • ベストアンサー率68% (17/25)
回答No.1

デコードするなら The Web KANZAKI の 文字化けしたメールの修復 http://kanzaki.com/docs/jis-recover.html どのようにエンコードされているのかは、とほほの WWW 入門の CGI から送信するメールのヘッダに日本語を用いるには http://tohoho.wakusei.ne.jp/wwwxx006.htm が役に立つと思います。

JF1Msf
質問者

補足

ありがとうございます。特に後者のサイトは、役に立ちました。 けっきょく、base64なわけですね。納得です。 大量のメールを自動的に変換したく思っているのですが、 Cで書かれているbase64のデコーダのソースプログラム、 なければPerlでもかまわないのですが、そんなものは どこかで手に入らないものでしょうか。

その他の回答 (1)

  • ogx
  • ベストアンサー率25% (32/125)
回答No.2

 私の場合、pascal ですが、こんな関数でシフトJISに直しています。(DOS 版です。)  自己流ソフトでスミマセン。正しいという保証はありません。  なお、このサイトでは、インデントが無視されてしまうので、とても見にくくなっています。 function mmdecode(inrec:string):string; (* MIMEをシフトJISコードに変換 *) (* MIME decode 参考文献=日経バイト No.177 1998.5 pp.294-297 *) function mmconv(mm:string):string; const BASE64= 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; const kin=#$1B+'$B'; kout1=#$1B+'(J'; kout2=#$1B+'(B'; var jis,sjis,s:string; m1,m2,m3,m4,n1,n2,n3:byte; nchar,loc,i:integer; begin jis:=''; (* JIS コードに変換 *) while mm<>'' do begin m1:=pos(mm[1],BASE64)-1; m2:=pos(mm[2],BASE64)-1; m3:=pos(mm[3],BASE64)-1; m4:=pos(mm[4],BASE64)-1; (* writeln('m1=',m1,' m2=',m2,' m3=',m3,' m4=',m4); *) if mm[3]='=' then nchar:=2 else if mm[4]='=' then nchar:=3 else nchar:=4; n1:=m1*4+m2 div 16; if nchar>2 then n2:=(m2 mod 16)*16+m3 div 4; if nchar>3 then n3:=(m3 mod 4)*64+m4; (* writeln('n1=',n1,' n2=',n2,' n3=',n3); *) if nchar=2 then jis:=jis+chr(n1) else if nchar=3 then jis:=jis+chr(n1)+chr(n2) else jis:=jis+chr(n1)+chr(n2)+chr(n3); delete(mm,1,4); end; (* write('jis='); for i:=1 to length(jis) do write(hex(ord(jis[i])),' '); *) (* JIS コードの内、漢字コードをシフトJISにする *) sjis:=''; while jis<>'' do begin loc:=pos(kin,jis); (* writeln('kin の位置=',loc); *) if loc=0 then begin sjis:=sjis+jis; jis:=''; end else begin sjis:=sjis+copy(jis,1,loc-1); delete(jis,1,loc+2); loc:=pos(kout1,jis); if loc=0 then loc:=pos(kout2,jis); if loc=0 then writeln('error kout なし'); s:=copy(jis,1,loc-1); (* write('s='); for i:=1 to length(s) do write(hex(ord(s[i])),' '); *) sjis:=sjis+jis2shift_jis(s); delete(jis,1,loc+2); end; end; (* writeln('mmconv の結果=',sjis); *) mmconv:=sjis; end; (* mmdecode 本体 *) const key1='=?ISO-2022-JP?B?'; key2='=?iso-2022-jp?B?'; keyend='?='; var result,mm:string; var loc:integer; begin result:=''; while inrec<>'' do begin loc:=pos(key1,inrec); if loc=0 then loc:=pos(key2,inrec); if loc=0 then begin result:=result+inrec; inrec:=''; end else begin result:=result+copy(inrec,1,loc-1); delete(inrec,1,loc+15); loc:=pos(keyend,inrec); if loc=0 then begin writeln('error 終わり「',keyend,'」が存在しない'); inrec:=''; end else begin mm:=copy(inrec,1,loc-1); delete(inrec,1,loc+1); (* writeln('mmconv に渡す文字列=',mm); *) if (length(mm) mod 4)<>0 then writeln('error BASE64 の長さが4の倍数でない') else result:=result+mmconv(mm); end; end; end; mmdecode:=result; end;

JF1Msf
質問者

お礼

やはりご自身で変換する必要があり、 独自のプログラムを書いたのでしょうか。 ご親切にありがとうございました。 7,8年前、僕もPascalを使っていたのですが、 Cに乗り換えて以来、すっかり忘れて、コンパイラすらない状況です。 頑張って、解読し、Cに書き直してみます。

関連するQ&A

  • エンコードとデコードについて

    世の中でエンコードとデコードという言葉が幅広く使用されています。 (音楽ではMP3⇔WAVの変換等) PC等で使用する機械語から離れてしまうこと(符号化)をエンコード、近づく(復号化)することをデコードと考えていいのでしょうか。 例として、PIC用プログラムをC言語で作成してコンパイルすることもデコードとなるのでしょうか。 以上です。よろしくお願いします。

  • エンコードとデコードについて

    はじめまして。 下記1、2の操作をした場合についてお尋ねします。 1、【SoundEngine】でwma形式の音楽ファイルをwav形式に変換。 2、【windows media エンコーダ9】でwav形式に変換した音楽ファイルをwma形式に戻す。 辞書で調べると、エンコードとデコードの意味は下記のとおりでした。 ・エンコード(encode)は、符号化ともいい、デジタルデータを一定の規則に従って、目的に応じた符号に変換することである。 ・デコード(decode)は、復号ともいい、エンコードの対義語。エンコードした情報を元に戻すこと。 下記サイトでは、上記1の操作がデコードで、上記2の操作がエンコードとなっています。 感覚的には、最初に行う上記1の操作がエンコードで、後に行う上記2の操作がデコードのような気がします。 正しくは、どのように理解すればよいのでしょうか。 どうか教えてください。 ●FL Studioを使った手探りのDTM http://filenotfound.blog15.fc2.com/blog-entry-120.html#

  • ヘッダに日本語を使えないはずなのに?

    フォームから受け取ったデータを、sendmailでメール送信するときに、ヘッダに日本語を含める場合はBASE64エンコードする必要があるとのことですが、subjectをJISのままで送信しても問題ありませんでした。 現在、fromは化けるのでmimew.plを使ってエンコードしていますが、subjectもエンコードした方がいいのでしょうか?自分宛に送信してみて化けなければ、エンコードの必要はないでしょうか?

    • ベストアンサー
    • Perl
  • 日本語 エンコード

    中国にいる日本人からメールが来るのですが、 エンコードが簡体時中国語(GB2312)になって いるため文字化けしてしまいます。 中国語のOutlookExpressを使用しているのですが、 日本語JISのエンコードをインストールさせる方法を 教えてください。

  • メール(iso-2022-jp-2)のデコード

    お世話になります。 C#.NETまたはVB.NETでiPhoneから送られたメールを解析するメーラーを作っているのですが、 charset=iso-2022-jp-2、charset=iso-2022-jp-3で送られてくる場合があり、 そのデコードができずに困っております。 charset=iso-2022-jpですと、下記でデコードできるのですが、 charset=iso-2022-jp-2、charset=iso-2022-jp-3はそもそも Encodingクラスで扱えるエンコーディング名に存在しないので、 どのように変換してよいか分かりません。 string mailtext = "?"; // ←メール内容をそのまま入れます byte[] bytes = Encoding.ASCII.GetBytes(mailtext); string body = Encoding.GetEncoding("iso-2022-jp").GetString(bytes); 宜しくお願い致します。

  • VB6.0 Base64のデコード方法を教えてください

    VB6.0 でメールソフトを作っているのですが、受信したメールのヘッダで Subject 部分を見ると、 Subject: =?ISO-2022-JP?B?GyRCJCIkJCQmJCgkKhsoQg==?= と訳の分からないアルファベットになってしまっています。 この Subject を日本語にする方法を教えてください。 一応、Base64のデコードという方法を知りましたが、この処理をVBで実行する場合のコードが分かりません。 工程的には下記の通りかと… サブジェクトの文字列から「?ISO-2022-JP?B?」の文字列の次のから「?=」までの間の文字列を抽出し、 GyRCJCIkJCQmJCgkKhsoQg== をネタに下記の処理。 1.各文字を2進数表記(6ビット単位)に変換(RFC 2045の Table 1 を使う)。 2.2進文字列(6ビット単位)を8ビット単位でまとめる。 3.8ビット単位の2進数をASCIIコードに変換。 4.シフトJISに変換。 ちなみに、この Subject の答えは あいうえお です。 分かる方、VBコードを教えてください。

  • メールのデコードについて(RFC2231)

    よろしくお願いいたします。 メーラー(Becky!やALMAIL等)によっては、RFC2231形式で添付ファイル名をエンコードして送信していますが、RFC2231形式で送信された添付ファイル名をデコードする方法をご教授いただきたく。 下記の@ITで紹介された記事によるとRFC2231形式は%の後ろ2文字の16進数がエンコードされた文字コードであるとなっています。 http://www.atmarkit.co.jp/fnetwork/rensai/netpro04/netpro01.html しかし、Becky!等のメーラーでは、下記の【】内のように、%の間が2文字以上の場合や、ASCII文字列は直接埋め込まれてしまうパターンがあります。 【filename*=iso-2022-jp''%1B%24B%24%5B%242%24%5B%242%1B%28B%2Etxt】→元は【ほげほげ.txt】 ASCII文字列が直接埋め込まれている部分は何とかなるとして、%24B%のような部分はどのようにデコードするのでしょうか? もしかしてBはBASE64?

  • エンコードを開くと、なぜか日本語(EUC)になっている

    IE6を使用 エンコードを開くと、なぜか日本語(EUC)になっている。 間違いなく日本語(自動選択)に設定したい。 EUCでだめな内容を見れなくてもよい? どうすればよいですか エンコードを開いた状態 自動選択(ここにチェックは入れない) -------------- 日本語(自動選択)これのみにしたい 日本語(EUC)これは絶対に無視したい 日本語(シフト-JIS)またはこれでもよい unicode(UTF-8)これは開発中今はまだ無視 その他▲ぜんぜん気にしたくない と言うようなことをすると何か弊害はありますか

  • エンコード 日本語(JIS)が選べない

    教えてください。 Internet Explorer 9 を使用しています。 エンコード  Unicode(UTF-8)が選ばれており、 支障をきたしています。 http://okwave.jp/qa/q8078148.html 上記で支障をきたす理由記載。 日本語(シフト JIS)を選びたいのですが チェックを変えると文字化けしてしまい、 ホームに戻ってみると文字化けが解消されるとともに Unicode(UTF-8)にもどってしまいます。 自動選択にチェックいれてみたりためしましたが どうしてもUnicode(UTF-8)に勝手に戻ってしまいます。 日本語(シフト JIS)を設定するにはどうすればいいでしょうか? ヒントでも結構です! 宜しくお願い致します。

  • シフトJIS⇒MIMEエンコード(RFC2047)

    シフトJISの文字列をMIMEエンコード(RFC2047) (メールのヘッダに使うような、=?ISO-2022-JP?B?・・・というようなヤツ) に変換する、unix系gcc(C++ではなくてC)でコンパイルできるライブラリ、 ないでしょうか。。? 途中まで作りかけたのですが、 あまりに複雑でギブアップしてしまいまして。。 また、用途上、nkfなどの外部プログラムは呼び出せないのです。