umqさんによるバグ報告

再現手順:

% echo -e "abcd\\nabcd" | iconv -tUTF-16LE > test.txt
% strings -el test.txt
abcd
abcd
% istrings -iUTF-16LE test.txt
abcdabcd

思ったよりめんどくさいです。直すのは直したんですけれど…。

上の echo で作ったファイルは

61 00 62 00 63 00 64 00 0A 00 61 00 62 00 63 00 64 00 0A 00

というバイト列になっています。ここで、UTF-16LEを検出させた場合、0A 00 というバイト列を見つけた時点で、文字として無効なバイトと判断し、それまでに検出していた 61 00 62 00 63 00 64 00 というバイト列(UTF-16LEで "abcd")を出力します。

61 00 62 00 63 00 64 00 0A 00 61 00 62 00 63 00 64 00 0A 00

そして、引き続き 00 から文字列の検出を開始します。

61 00 62 00 63 00 64 00 0A 00 61 00 62 00 63 00 64 00 0A 00

最初に、文字として正しいか判断されるのは、00 61 というバイト列になります。これは、"愀"という文字であり、正しい文字と判断されます。次に 00 62 を "戀" として正しい文字と認識し、その後、00 63 を文字として不正なものと判断します。

61 00 62 00 63 00 64 00 0A 00 61 00 62 00 63 00 64 00 0A 00

文字列として2文字しか続いていませんので、00 61 00 62 というバイト列は istrings の結果として出力されません。そして、この後は 63 以降が文字列の検査対象として走査されることになります。

61 00 62 00 63 00 64 00 0A 00 61 00 62 00 63 00 64 00 0A 00

結局、文字列として画面に出力されるのは、最初の abcd だけになってしまいます。
とりあえず、「これは仕様です」と言ってよいんですかねぇ…。言いたくないなぁ。