電子メールの件名やあて先など、日本語を使うと、
インターネットヘッダ内では、例えば以下のような
ASCII文字にエンコードされていますが、
=?iso-2022-jp?Q?=1B$BEE;R%a!<%k$N7oL>?=
これはどんな規則でエンコードされているのでしょうか。
つまり、メーラを使わずに手操作でデコードしたいのですが、
どのような手続きをとれば、日本語(シフトJISなど)に
変換できるのでしょうか?
あるいは、フリーの変換ソフトなどがあれば、教えていただきたく
思っています。
No.1ベストアンサー
- 回答日時:
デコードするなら The Web KANZAKI の
文字化けしたメールの修復
http://kanzaki.com/docs/jis-recover.html
どのようにエンコードされているのかは、とほほの WWW 入門の
CGI から送信するメールのヘッダに日本語を用いるには
http://tohoho.wakusei.ne.jp/wwwxx006.htm
が役に立つと思います。
この回答への補足
ありがとうございます。特に後者のサイトは、役に立ちました。
けっきょく、base64なわけですね。納得です。
大量のメールを自動的に変換したく思っているのですが、
Cで書かれているbase64のデコーダのソースプログラム、
なければPerlでもかまわないのですが、そんなものは
どこかで手に入らないものでしょうか。
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;
やはりご自身で変換する必要があり、
独自のプログラムを書いたのでしょうか。
ご親切にありがとうございました。
7,8年前、僕もPascalを使っていたのですが、
Cに乗り換えて以来、すっかり忘れて、コンパイラすらない状況です。
頑張って、解読し、Cに書き直してみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) URLのエンコードで日本語は16進数に変換されると学びましたが、16進数とひらがなや漢字が対応してる 4 2022/08/04 17:08
- その他(メールソフト・メールサービス) メールソフトを教えてください 1 2023/03/28 23:32
- マウス・キーボード 教えて! AppleのMagic Keyboard(JIS)をWindows 10で使用次第のですが 2 2022/06/01 18:07
- UNIX・Linux テキストファイルをページ番号付きでコマンドラインから印刷したい 1 2023/02/22 12:47
- CPU・メモリ・マザーボード AMD CPUの再生支援、ハードウェア動画エンコード機能について 1 2023/08/26 22:16
- その他(コンピューター・テクノロジー) 「プロトコル」の定義について 5 2023/04/16 13:13
- 画像編集・動画編集・音楽編集 無料の動画編集ソフトで日本語の物を教えて下さい。 1 2022/06/29 17:14
- テレビ NHK 衛星8K(BS8K)を見てトラブルになってるんですが、ライブ映像の8Kを見た時に、恐らくエン 1 2023/01/03 21:15
- その他(メールソフト・メールサービス) outlookからの送信された件名が文字化けします 2 2023/04/18 14:29
- WordPress(ワードプレス) 【WordPress/PHP】取得した値(日本語)がエンコードされてしまうのを日本語のまま出力したい 1 2022/08/28 22:59
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
車って ぶつかったらわかりま...
-
車の運転で、かなりゆっくりバ...
-
カーセックスしたことあります...
-
子どもにボール遊びをさせたら...
-
高級時計も車もシェアリングで...
-
車内にカメムシが巣を作った?
-
ドアパンチして逃げる人の割合...
-
昨日スーパーの駐車場で隣の車...
-
高速道路から一般道に下りる際...
-
絶対自分の車出さない人ってな...
-
全くの無傷の当て逃げをしたこ...
-
車の左前にこんな傷がありまし...
-
時速10キロで人に当たっても...
-
車の下部を段差にぶつけてしま...
-
免許に10回落ちて親と大喧嘩し...
-
「ご移動ください」は正しい敬...
-
教習所でマニュアル車のギアチ...
-
スーパーの閉店時間を過ぎて駐...
-
バルサンなどを車に使っても大...
-
駐車場での当て逃げは警察は捜...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
車って ぶつかったらわかりま...
-
2月末とは2月の何日~何日まで...
-
カーセックスしたことあります...
-
当て逃げしてしましました。
-
車の運転で、かなりゆっくりバ...
-
子どもにボール遊びをさせたら...
-
ドアパンチして逃げる人の割合...
-
昨日スーパーの駐車場で隣の車...
-
運転が下手すぎて自信をなくし...
-
車の左前にこんな傷がありまし...
-
全くの無傷の当て逃げをしたこ...
-
駐車場での当て逃げは警察は捜...
-
車の下部を段差にぶつけてしま...
-
前面道路4m、駐車場幅2.8mにア...
-
高速道路から一般道に下りる際...
-
時速10キロで人に当たっても...
-
一戸建ての駐車場から車の先端...
-
当て逃げしてしまったと思いま...
-
ドアパンチされました。ドラレ...
-
車庫証明に関する質問。(2km以...
おすすめ情報