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
これがもとの文字列のバイト列に一致する。