Rendezvous-Tokyo

$Bや(Bがやたら多い文字化けメールの解読

知り合いから「こういうのって解読できる?」って送られてきたのが

$BK\%7%9%F%`$K4X$9$k5,Ls$O!"2<5-(BURL$B$r$4Mw$/$@$5$$!#(B

みたいなメール文。

とりあえず解決方法

エンジニア向けには以下

  1. JISの[ESC]コードが欠落しているので補完してあげる。
  • $B -> \x1b$B
  • (B -> \x1b(B
  1. iso-2022-jp系でデコードする

以下、pythonで作った解読プログラム

# ESCシーケンスを補完する関数
def complete_jis_escape_sequences(jis_string):
    completed_jis_string = jis_string.replace(b'$B', b'\x1b$B').replace(b'(B', b'\x1b(B')
    return completed_jis_string

# 解読したい文字列
string = b'$BK\%7%9%F%`$K4X$9$k5,Ls$O!"2<5-(BURL$B$r$4Mw$/$@$5$$!#(B'

# ESCシーケンスを補完
completed_jis_string = complete_jis_escape_sequences(string)

encode_list = [
  "euc-JP",
  "utf-8",
  "shift_jis",
  "iso-2022-jp",
  "iso2022_jp",
  "iso2022_jp_1",
  "iso2022_jp_2",
  "iso2022_jp_2004",
  "iso2022_jp_3",
  "iso2022_jp_ext",
]

for encode in encode_list:
  print(encode)
  decoded = completed_jis_string.decode(encode)
  print(decoded)

出力結果(OKパターン)

euc-JP
K\%7%9%F%`$K4X$9$k5,Ls$O!"2<5-URL$r$4Mw$/$@$5$$!#
utf-8
K\%7%9%F%`$K4X$9$k5,Ls$O!"2<5-URL$r$4Mw$/$@$5$$!#
shift_jis
K\%7%9%F%`$K4X$9$k5,Ls$O!"2<5-URL$r$4Mw$/$@$5$$!#
iso-2022-jp
本システムに関する規約は、下記URLをご覧ください。
iso2022_jp
本システムに関する規約は、下記URLをご覧ください。
iso2022_jp_1
本システムに関する規約は、下記URLをご覧ください。
iso2022_jp_2
本システムに関する規約は、下記URLをご覧ください。
iso2022_jp_2004
本システムに関する規約は、下記URLをご覧ください。
iso2022_jp_3
本システムに関する規約は、下記URLをご覧ください。
iso2022_jp_ext
本システムに関する規約は、下記URLをご覧ください。

解決までの経緯

自分の経験上あまりピンとこない文字化けだったが、調べてみると iso2022_jp 系が $B とかあって近いかも?って感じだったがエスケープせずにデコードしても解決せず。

出力結果(NGパターン)

euc-JP
$BK\%7%9%F%`$K4X$9$k5,Ls$O!"2<5-(BURL$B$r$4Mw$/$@$5$$!#(B
utf-8
$BK\%7%9%F%`$K4X$9$k5,Ls$O!"2<5-(BURL$B$r$4Mw$/$@$5$$!#(B
shift_jis
$BK\%7%9%F%`$K4X$9$k5,Ls$O!"2<5-(BURL$B$r$4Mw$/$@$5$$!#(B
iso-2022-jp
$BK\%7%9%F%`$K4X$9$k5,Ls$O!"2<5-(BURL$B$r$4Mw$/$@$5$$!#(B
iso2022_jp
$BK\%7%9%F%`$K4X$9$k5,Ls$O!"2<5-(BURL$B$r$4Mw$/$@$5$$!#(B
iso2022_jp_1
$BK\%7%9%F%`$K4X$9$k5,Ls$O!"2<5-(BURL$B$r$4Mw$/$@$5$$!#(B
iso2022_jp_2
$BK\%7%9%F%`$K4X$9$k5,Ls$O!"2<5-(BURL$B$r$4Mw$/$@$5$$!#(B
iso2022_jp_2004
$BK\%7%9%F%`$K4X$9$k5,Ls$O!"2<5-(BURL$B$r$4Mw$/$@$5$$!#(B
iso2022_jp_3
$BK\%7%9%F%`$K4X$9$k5,Ls$O!"2<5-(BURL$B$r$4Mw$/$@$5$$!#(B
iso2022_jp_ext
$BK\%7%9%F%`$K4X$9$k5,Ls$O!"2<5-(BURL$B$r$4Mw$/$@$5$$!#(B

いろいろ調べてたら次のサイトに辿りつき、ひとまず解読できることはわかった。

あとはそれっぽいキーワードで調べると解説サイトがいくつかあったので、無事理解ができました。

以上。