• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:quoted-printableでの「=」の扱い)

quoted-printableでの「=」の扱い

このQ&Aのポイント
  • quoted-printableでの「=」の扱いについて調査しました。
  • E-Mailでの文字コードiso-2022-jp、エンコードはquoted-printableの場合、文字コードに「3D」(エンコードすると=になる)を含む文字が出てきた場合の処理方法を調査しました。
  • 特定の環境で受け取ったメールの一部が文字化けしており、その原因を調査しました。また、エンコードおよびデコードの際に、「=」がどのように扱われるかについても考察しました。

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

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.3

> 「3D」を含む文字(「週」とか「そ」とか「出」とか)は、出てきた「=」についてもう一度エンコードしておかないと、デコードの際に問題が発生する、という感じで大丈夫でしょうか? 「エンコード」も「デコード」も一回こっきりです。「もう一度エンコードする」のではなく、一度のエンコードで、データ中の「1B や3Dを全て変換」するのです。 「エンコードしたものをまたエンコード」したり「デコードしたものをまたデコード」することはありませんし、してはいけません。 文字化けの要因は、おそらくデコードしなくていい文字列をさらにデコードしてしまっているということでしょう。 たとえば「そして=3D今週中」という文字列は、ISO-2022-JPでは 「ESC $B$=$7$F ESC (B=3D ESC $B:#=5Cf ESC (B」 (1B 24 42 24 3D 24 37 24 46 1B 28 42 3D 33 44 1B 24 42 3A 23 3D 35 43 66 1B 28 42) になります。(わかりやすくするため、ESC(1B)の前後にスペースを入れてあります) この文字列をquoted-printableにした場合、文字列中の printable でない文字「ESC」(1B)と「=」(3D)をquoteして「=1B」「=3D」に変換することになります。結果として、 「=1B$B$=3D$7$F=1B(B=3D3D=1B$B:#=3D5Cf=1B(B」 が「そして=3D今週中」を quoted-printable にしたものになります。 これをデコードすると、「=とそのあとの16進二桁」である「=1B」と「=3D」がそれぞれ ESC と = に変換されますので、 「ESC $B$=$7$F ESC (B=3D ESC $B:#=5Cf ESC (B」 すなわち、元通りの「そして=3D今週中」という文字列に戻ります。 この「一回のエンコード処理」および「一回のデコード処理」が、本来のquoted-printableの処理すべき姿です。 とこが、この文字列を、さらquoted-printableとしてデコードしてしまうと、 「=3D」が「=」に、「=5C」が「\」に変換されてしまいますので、 「ESC $B$=$7$F ESC (B= ESC $B:#\f ESC ( B」 つまり「そして=今樔」になってしまうのです。 これは、間違った処理結果です。

metis
質問者

お礼

再びありがとうございます。 これを見て、いろいろと混乱していたことに漸く気がつきました…(滝汗) 最初の記号混じりはただ単にJISを区切ってASCII文字に置き換えただけなのですね。 で、そこから先がquoted-printableで処理する領域、と…。 わざわざありがとうございました! おかげ様で理解できました。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.2

エンコードする側については「=」は必ず「=3D」にエンコードする必要はありますが、 「\」はquoted-printable でエンコードすべき文字ではありませんので、「\」のまま送るのが普通です。=5Cにする必要はありません。ですが、=5Cにエンコードしたとしても、quoted-printableとして正しい出力ではあります。 一方quoted-printable の「デコードのルール」は、 ・「=とその後の16進数二桁」は、全て、その16進数値の示す文字に変換 ・「行末の=とその後の改行」は削除(改行を消す) するというものです。 つまり、受け取った側では、=1Bだけでなく、=3D や =5C も、とにかく=が出てきたら必ずデコード処理をしなければなりません。

metis
質問者

お礼

ありがとうございます。 デコードのルールを読んで、何となく理解できました。 「3D」を含む文字(「週」とか「そ」とか「出」とか)は、出てきた「=」についてもう一度エンコードしておかないと、デコードの際に問題が発生する、という感じで大丈夫でしょうか? っと… そのルールだと、もし一度目のエンコードで「=5Cf」などになったとしたら、もう一度「=3D5Cf」とエンコードしておいたとしても、 =3D5Cf → =5Cf → \f とかにはなったりしないんですかね? そんな文字が存在するかは謎ですが…。

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「=」そのものを表すなら, 当然「=3D」とエンコードしなければなりません.

metis
質問者

お礼

ありがとうございます。 そこまでは問題ないのですが、エンコードしていった部分に=が出てきたらどうなるのかな、と思って質問させていただきました(詳しくはもう1人の方へのお礼で)。

metis
質問者

補足

お礼を埋めてしまったので補足で失礼します。 No.3へのお礼の方で書きましたが、こちらの認識(理解?)不足の結果だったようです。 その前提で見ると、No.1へのお礼はちょっといかがなものか…と思ってしまい、恥ずかしい限りです。 非礼をお詫びいたします。 御回答、ありがとうございました。

すると、全ての回答が全文表示されます。

関連するQ&A