Imap.Body.header部のDecodeに、使用するISO_2022-jpのdecodeの変換方法をお教え願います。
S:=TNetEnCoding.Base64.Decode(S);--->UTF8、Base64で動作可能ですが、
ISO_2022-jpのdecodeを検索しましたが、見つかりません。(ダータ入力して、変換する))は、沢山ありが
宜しくお願い致します。
誤翻訳なのか掲示板にエラーが発生しているのか
ISO-2022-JPは、ほんの少しの制御コードが含まれているJISコードですので
制御コードを探して JISコードをShiftJISに変換すれば良いだけです。
#$1b : 次の2バイトが制御コードであることを表す
'$B' : 以降はJISコードであることを表す制御コード
'(B' : 以降はASCIIコードであることを表す制御コード
takeさま、どうもありがとうございます。お忙しい処、お手数ですが、計算式を、お教え願えませんか
(勉強しなさいといわずに)、宜しくせめて記載URLでも
ISO-2022-JPを変換する処理は公開しますが、他の変換は自力でなんとかしましょう。
あとWindpws10のメールソフトはなぜかUnicode直接送ってくるので鬼門です。
//--------------------------------------------------------------------------//
// //
// ~ ISO-2022-JPを変換してShiftJIS文字列にする ~ //
// //
// - Input - str : ISO-2022-JPの文字列 //
// //
// - Output - ShiftJISへコード変換した文字列 //
// //
//--------------------------------------------------------------------------//
function Iso2022jpToStr(const str: string): string;
var
s : Ansistring;
sr,se : Ansistring;
c : AnsiChar;
i,n,c1,c2 : Integer;
begin
s := Ansistring(str);
n := 0;
c1 := 0;
for i := 1 to Length(s) do begin // 文字の長さ分ループ
c := s[i]; // 1文字取得
if c = #$1b then begin // エスケープコード #$1B の場合
n := 1; // 次の2バイトは制御コードとする
se := ''; // 制御判定用文字列の初期化
end
else begin // エスケープコードではない場合
case n of // 処理段階に応じて分岐
0 : sr := sr + AnsiChar(c); // 通常はASCIIコードとして処理する
1 : begin // 制御コードの1バイト目の場合
se := se + AnsiChar(c); // 制御コードとして蓄積
n := 2; // 次は制御コード2バイト目とする
end;
2 : begin // 制御コード2バイト目の場合
se := se + AnsiChar(c); // 制御コードとして蓄積
if se = '$B' then n := 3; // $B なら以降はJISコードとなる
if se = '(B' then n := 0; // (B なら ASCIIコードに戻る
end;
3 : begin // JISコード1バイト目の場合
c1 := Ord(c); // JISコード1バイト目として格納
n := 4; // JISコード2バイト目の処理へ
end;
4 : begin // JISコード2バイト目の場合
c2 := Ord(c); // JISコード2バイト目として格納
n := 3; // JISコード1バイト目の処理へ
sr := sr + JisToSJis(c1,c2); // JISコードをShiftJISに変換して処理
end;
end;
end;
end;
result := string(sr); // 返り値とする
end;
//--------------------------------------------------------------------------//
// //
// ~ JISコードをShift-JISコードに変換 ~ //
// //
//--------------------------------------------------------------------------//
function TJisToSJis(Code1, Code2: Integer): Ansistring;
var
s : string;
begin
if (Code1 and $01) <> 0 then begin
Code2 := Code2 + $1f;
end
else begin
Code2 := Code2 + $7d;
end;
Code1 := ((Code1 - $21) shr 1) + $81;
if Code2 >= $7f then Inc(Code2);
if Code1 > $9f then Inc(Code1,$40);
s := IntToHex(Code1,2) + ' ' + IntToHex(Code2,2);
result := AnsiChar(Code1) + AnsiChar(Code2);
end;
takeさま、ご無理を申し上げました。本当に有難う御座いました。
これで、検討してます。お礼まで
ツイート | ![]() |