
・E-Mailで、文字コードはiso-2022-jp、エンコードがquoted-printable(ヘッダに誤りはない)
・各行で、エンコードされている部分は、「=1B$B」「=1B(B」で挟まれている
という状況で、文字コードに「3D」(エンコードすると=になる)を含む文字が出てきた場合、どう処理されるのでしょうか。
例:「そして(24 3D 24 37 24 46)」という文字列
エンコードすると、「$=$7$F」
ここで、この「=」は、さらにエンコードして「=3D」にするのでしょうか?
それとも、「=」そのままで扱うのでしょうか?
ある環境で受け取ったメールが一部文字化けしていたので調べたところ、
この部分が、「$=3D$7$F」とエンコードされていました。
(この部分は文字化けしていません)
文字化けしていたのは、「今週中(3A 23 3D 35 43 66)」の部分で、
エンコードすると「:#=5Cf」になると思うのですが、こちらの環境で「今樔(3A 23 5C 66)」になっていました。
デコードする際に、「=5C」→「\」にすると辻褄が合いそうなのですが…。
(ただ、受け取ったメールでは、この部分は「:#\f」になっていました。1回デコード済み?)
エンコードするシステムの管理にかかわっているわけではないので、半分興味本位(もう半分は、場合によっては不具合報告を出すため)なのですが、ご教示いただけると幸いです。
…まぁ、iso-2022-jpをわざわざquoted-printableでエンコードしなくても、とも思うのですが、絵文字とか対応のためにやってるのかなぁ、と…。
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」
つまり「そして=今樔」になってしまうのです。
これは、間違った処理結果です。
再びありがとうございます。
これを見て、いろいろと混乱していたことに漸く気がつきました…(滝汗)
最初の記号混じりはただ単にJISを区切ってASCII文字に置き換えただけなのですね。
で、そこから先がquoted-printableで処理する領域、と…。
わざわざありがとうございました!
おかげ様で理解できました。
No.2
- 回答日時:
エンコードする側については「=」は必ず「=3D」にエンコードする必要はありますが、
「\」はquoted-printable でエンコードすべき文字ではありませんので、「\」のまま送るのが普通です。=5Cにする必要はありません。ですが、=5Cにエンコードしたとしても、quoted-printableとして正しい出力ではあります。
一方quoted-printable の「デコードのルール」は、
・「=とその後の16進数二桁」は、全て、その16進数値の示す文字に変換
・「行末の=とその後の改行」は削除(改行を消す)
するというものです。
つまり、受け取った側では、=1Bだけでなく、=3D や =5C も、とにかく=が出てきたら必ずデコード処理をしなければなりません。
ありがとうございます。
デコードのルールを読んで、何となく理解できました。
「3D」を含む文字(「週」とか「そ」とか「出」とか)は、出てきた「=」についてもう一度エンコードしておかないと、デコードの際に問題が発生する、という感じで大丈夫でしょうか?
っと…
そのルールだと、もし一度目のエンコードで「=5Cf」などになったとしたら、もう一度「=3D5Cf」とエンコードしておいたとしても、
=3D5Cf → =5Cf → \f
とかにはなったりしないんですかね?
そんな文字が存在するかは謎ですが…。
No.1
- 回答日時:
「=」そのものを表すなら, 当然「=3D」とエンコードしなければなりません.
この回答への補足
お礼を埋めてしまったので補足で失礼します。
No.3へのお礼の方で書きましたが、こちらの認識(理解?)不足の結果だったようです。
その前提で見ると、No.1へのお礼はちょっといかがなものか…と思ってしまい、恥ずかしい限りです。
非礼をお詫びいたします。
御回答、ありがとうございました。
ありがとうございます。
そこまでは問題ないのですが、エンコードしていった部分に=が出てきたらどうなるのかな、と思って質問させていただきました(詳しくはもう1人の方へのお礼で)。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(メールソフト・メールサービス) outlookからの送信された件名が文字化けします 2 2023/04/18 14:29
- その他(プログラミング・Web制作) 文字コード及びフォントに関する次の記述を読み,適切なものをすべて選べ。 ASCIIとは,英数字だけを 4 2023/01/11 19:10
- PHP phpの imap_search で漢字コード 1 2022/09/06 17:32
- その他(プログラミング・Web制作) URLのエンコードで日本語は16進数に変換されると学びましたが、16進数とひらがなや漢字が対応してる 4 2022/08/04 17:08
- Visual Basic(VBA) 特定の文字を簡単な操作で半角スペースに変換するか削除したい 2 2022/11/01 10:35
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- PHP カラーミーショップのSmartyでの文字列抜き出し 2 2022/05/06 11:51
- その他(プログラミング・Web制作) VB.NETの正規表現について 4 2022/04/12 16:54
- Perl perlについての質問 2 2022/10/17 15:25
- Visual Basic(VBA) ファイル名の右側を変更したい ファイル名:「1001日別売上」の左側へ「2022」を追加し、「202 6 2022/10/14 10:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
至急です。 電源入れたままSIM...
-
soc、マイコン、ARM、組み込み...
-
教えてください Windows11で暗...
-
ワード作成した名刺の大量印刷...
-
AI を おちょくる質問
-
職場のノートパソコンを起動す...
-
外付けSSDを暗号化する機能はAn...
-
宮崎駿作品集15枚組を購入した...
-
スマホのUSBポートやタブレット...
-
AndroidでLinuxを動かすアプリ...
-
UQモバイルやLINEモバイルやmin...
-
rsyncをインストールするとssh...
-
Linuxユーザーはリモートアクセ...
-
Linuxはバージョンごとにコード...
-
microSDカードと外付けSSDって...
-
パソコンはスマホと違って重い...
-
皆さん、おはようございます♪ N...
-
パソコンのキーボードって不要...
-
Debianをノートパソコンにイン...
-
パスワードをハッシュ値にして...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
セキュリティのためにログを見...
-
半角カタカナについて
-
急にパソコンが インターネット...
-
チャットgptなんですけど、こん...
-
皆さん、おはようございます♪ N...
-
LinuxやWindowsより Androidやi...
-
パソコンのキーボードって不要...
-
Power BI のローソクチャート
-
文字コードを確認する方法を教...
-
バグがないソフトウェアを作る...
-
職場のノートパソコンを起動す...
-
NECのノート型パソコンを購入し...
-
チャタリングが起きるのはメカ...
-
パソコンはスマホと違って重い...
-
PowerBIで最大値、最小値を表示...
-
Androidにシェルがないのは何故...
-
【スプレッドシート】複数条件...
-
文章を書くのに最適なAI、Chat ...
-
Androidでは写真や動画は撮影日...
-
外付けSSDを暗号化する機能はAn...
おすすめ情報