(1996.11.09/2003.04.21upd)
@quoted printableデコード
AJIS→S-JIS変換
【注意】メールをデコードするときは、ヘッダ削除してからデコードすること。quoted printableで特別な意味を持つ「=」がヘッダに含まれていると、正常な変換ができない。
【エンコードの原理】=に続く2文字でASCIIコードを指定。ただし、通常のアルファベット26文字の大文字および小文字は変換しない。
例)=25 → % (%のASCIIコードは25)
【継続文字】=単体で行末に置かれた場合は継続文字となる。したがって、全体のデコードに掛かる前に、あらかじめ継続行の処理を行っておくことが望ましい。
^[$B.....^[(B
なお、なぜかKinとKoutは複数の種類があるので注意。
| Kin | Kout | 備 考 | |
|---|---|---|---|
| ^[$B | .... | ^[(J | 本当はこちらが標準らしい |
| ^[$B | .... | ^[(B | これも多い |
| ^[$? | .... | ^[(? | これは少数派かな? |
なお、メールのSubject欄などでは、=?iso-2022-jp?B?〜〜?=の形式で表現されることがあるが、この〜〜の部分が実はbase64(quoted printableではない)でエンコードされている。これをデコードしたものが、JISコード形式になる。
また、JIS->S-JISのコード変換は以下のような数学的な変換でOK(以下はREXXで記述されている)。
/*********************************** Kaji output sub-routine JIS >> Shift-JISX convert core ************************************/ toSJIS: Procedure ; c1=Arg(1); c2=Arg(2); if (C2D(c1)//2)=1 then do sj2=C2D(c2)+31; if sj2>126 then sj2=sj2+1; end else sj2=C2D(c2)+126; sj1=(C2D(c1)-33)%2+129; if sj1>159 then sj1=sj1+40; RETURN D2c(sj1)||D2c(sj2)
/****************************************************
quoted printable mail decoder ver.1.1 (03/04/20)
ISO-2022-J & quoted printable
(c)1997 Nogure Ten
2003.04.20 大幅改造、ほぼ完成
*****************************************************/
InFile=arg(1)
if InFile='' then do
say '-------------------------------'
say 'QP ver.1.1 (c)2003 NogureTen'
say 'quoted printable (MIME) decoder'
say 'usage : qp <input file> [Enter]'
say '-------------------------------'
exit
end
if stream(InFile,'C','query exist')='' then do
say InFile||' : file not found !'
exit
end
PARSE value InFile with f'.'e
inp=InFile
out=f||'.'||'out'
tmp=f||'.'||'tmp'
/*************************************************
Decode 0:
decode line past >> tmpfile
**************************************************/
'@DEL' tmp
CALL STREAM inp,'C','open read'
CALL STREAM tmp,'C','open write'
Do While lines(inp)>0
st=LineIn(inp);
IF Right(st,1)='='
Then Call CharOut tmp, Left(st,Length(st)-1);
Else Call LineOut tmp, st;
End;
CALL STREAM file,'C','CLOSE'
CALL STREAM file,'C','CLOSE'
/*************************************************
Decode 1:
decode quoted printable >> tmp
**************************************************/
CALL LINEOUT ,'decode 1: quoted printable decode'
'@DEL' out
CALL STREAM tmp,'C','open read'
CALL STREAM out,'C','open write'
Do while Lines(tmp)>0
ch=charin(tmp);
IF ch='=' THEN
DO
ch2=CharIn(tmp,,2);
Call CharOut out,x2c(ch2);
CALL CHAROUT ,'.'
End;
ELSE CALL CHAROUT out,ch;
end
CALL STREAM tmp,'C','CLOSE'
CALL STREAM out,'C','CLOSE'
CALL LINEOUT ,''
/************************************************
Decode2 :
convert Kin/Kout Convert
*************************************************/
SAY 'Do you want JIS -> SJIS convert ? (y/n)'
PULL yn
IF yn='N' THEN EXIT
'@COPY' out tmp
'@DEL' out
CALL LINEOUT ,'decode 2: Kin/Kout Convert'
CALL STREAM tmp,'C','open read'
CALL STREAM out,'C','open write'
Sin ='0f'x;
Sout='0e'x;
Kin ='1B'x||'$B';
Kout='1B'x||'(J';
Kou2='1B'x||'(B'; /* Koutは何故か2種類ある */
Do While Lines(tmp)>0
st=LineIn(tmp);
Do While POS(Kin,st)>0;
p =POS(Kin,st);
st=Left(st,p-1)||Sin||Substr(st,p+3);
End;
Do While POS(Kout,st)>0;
p =POS(Kout,st);
st=Left(st,p-1)||Sout||Substr(st,p+3);
End;
Do While POS(Kou2,st)>0;
p =POS(Kou2,st);
st=Left(st,p-1)||Sout||Substr(st,p+3);
End;
Call LineOut out, st;
Call CharOut ,'='
End;
CALL STREAM tmp,'C','CLOSE'
CALL STREAM out,'C','CLOSE'
CALL LINEOUT ,''
/************************************************
Decode3 :
convert JIS >> Shift-JIS
*************************************************/
'@COPY' out tmp
'@DEL' out
CALL LINEOUT ,'decode 3: JIS >> S-JIS'
CALL STREAM tmp,'C','open read'
CALL STREAM out,'C','open write'
KFlag=0;
Do While Lines(tmp)>0
ch=CharIn(tmp);
Select
When ch=Sin Then Do; KFlag=1; Call CharOut,'<'; End;
When ch=Sout Then Do; KFlag=0; Call CharOut,'>'; End;
Otherwise
IF KFlag=0 Then Call CharOut out, ch;
IF KFlag=1 Then
Do
ch2=CharIn(tmp);
SJ=toSJIS(ch,ch2);
Call CharOut out, SJ;
End;
/*End of Otherwise*/
END;
End;
CALL STREAM tmp,'C','CLOSE'
CALL STREAM out,'C','CLOSE'
CALL LINEOUT ,''
Exit
/***********************************
Kaji output sub-routine
JIS >> Shift-JISX convert core
************************************/
toSJIS: Procedure ; c1=Arg(1); c2=Arg(2);
if (C2D(c1)//2)=1 then do
sj2=C2D(c2)+31;
if sj2>126 then sj2=sj2+1;
end
else sj2=C2D(c2)+126;
sj1=(C2D(c1)-33)%2+129;
if sj1>159 then sj1=sj1+40;
RETURN D2c(sj1)||D2c(sj2)