zsh のhistoryファイルは特殊な処理が入っているので文字化けする zsh historyにおける非ASCII文字の扱いについて

文字化けしたzsh_historyファイルを読めるようにする

ぁあぃいぅうぜそぞただちぢっつづ という文字列を使って調べていく。 これらは頭2バイトが e381、末尾1バイトがそれぞれいかのようになる。

  • : 81
  • : 82
  • : 83
  • : 84
  • : 85
  • : 86
  • : 9c
  • : 9d
  • : 9e
  • : 9f
  • : a0
  • : a1
  • : a2
  • : a3
  • : a4
  • : a5

zsh_historyで見ると以下のようなバイト列になっている(わかりやすいよう適宜スペースを入れている)

E38181 E38182 E38183A3 E38183A4 E38183A5 E38183A6 E38183BC E38183BD E38183BE E38183BF E3818380 E3818381 E3818382 E381A3 E381A4 E381A5

zsh_historyの文字コードはlatin1なのでほぼUTF-8と同じ。 文字コード表をもとに当てはまる文字に戻すと、 0x83-0xA2 のとき、直前に 0x83 を入れてから6bit目を反転させていることがわかる。

E38181 E38182 E38183A3 E38183A4 E38183A5 E38183A6 E38183BC E38183BD E38183BE E38183BF E3818380 E3818381 E3818382 E381A3 E381A4 E381A5

0x83 を消して、直後の6bit目を反転させると以下のようになる

E38181 E38182 E38183 E38184 E38185 E38186 E3819C E3819D E3819E E3819F E381A0 E381A1 E381A2 E381A3 E381A4 E381A5

これがもとの文字列のバイト列に一致する。