IMapの受信時にiso-2022-jpのdecodeの変換方法をお教え願います。


Hiisan  2020-11-16 20:43:21  No: 149366

Imap.Body.header部のDecodeに、使用するISO_2022-jpのdecodeの変換方法をお教え願います。
S:=TNetEnCoding.Base64.Decode(S);--->UTF8、Base64で動作可能ですが、
ISO_2022-jpのdecodeを検索しましたが、見つかりません。(ダータ入力して、変換する))は、沢山ありが
宜しくお願い致します。


take  2020-11-17 08:55:24  No: 149368

誤翻訳なのか掲示板にエラーが発生しているのか

ISO-2022-JPは、ほんの少しの制御コードが含まれているJISコードですので
制御コードを探して JISコードをShiftJISに変換すれば良いだけです。

#$1b : 次の2バイトが制御コードであることを表す
'$B' : 以降はJISコードであることを表す制御コード
'(B' : 以降はASCIIコードであることを表す制御コード


Hiisan  2020-11-17 13:28:13  No: 149369

takeさま、どうもありがとうございます。お忙しい処、お手数ですが、計算式を、お教え願えませんか
(勉強しなさいといわずに)、宜しくせめて記載URLでも


take  2020-11-17 13:43:28  No: 149370

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;


hiisan  2020-11-17 22:38:27  No: 149371

takeさま、ご無理を申し上げました。本当に有難う御座いました。
これで、検討してます。お礼まで


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加