zsh のヒストリファイルの仕様について

zshのhistoryファイルを直接開くと、日本語が文字化けしているが、 historyコマンドの結果は文字化けしていない。

内部でなにか変換をかけているはずで、調べてみたところ、同じようなところで困っている人がいた。

https://github.com/dvorka/hstr/pull/416 .zsh_historyにおける非ASCII文字の扱いについて - 生涯未熟

どうやらmetafy/unmetafyという処理をしているらしく、 メタなバイトがあったら 0x83 を挿入して、0x20とのxorを取り6bit目を反転させている。

https://github.com/zsh-users/zsh/blob/master/Src/utils.c#L4921-L4933

mod_export char *
unmetafy(char *s, int *len)
{
    char *p, *t;
 
    for (p = s; *p && *p != Meta; p++);
    for (t = p; (*t = *p++);)
	if (*t++ == Meta && *p)
	    t[-1] = *p++ ^ 32;
    if (len)
	*len = t - s;
    return s;
}