grep: またUnicode周りでキモいコミット見つけた

By | 2014年5月7日

久しぶりのgrepネタ。今度はまだリリース版に入ってないコミットの話。

commit c50283a3a8d15d382691c447c3a1e1fde1c548fc “grep: fix bugs with -i and titlecase”

実はかなり前に見つけてたのだが、解説するのが遅くなった。全国のgrepファンのみなさん、ごめんなさい。

+ grep -i no longer mishandles patterns containing titlecase characters.
+ For example, in a locale containing the titlecase character
+ ‘Lj’ (U+01C8 LATIN CAPITAL LETTER L WITH SMALL LETTER J),
+ ‘grep -i Lj’ now matches ‘LJ’ (U+01C7 LATIN CAPITAL LETTER LJ).

どうやら”L”と”j”を合わせた文字で’Lj’ (U+01C8 LATIN CAPITAL LETTER L WITH SMALL LETTER J)という文字があって、その周りの問題をなおしたらしい。この文字についてはUnicode本家のコード表(pdf注意)を参照のこと。これ見てると「NJ」というもう一個キモいの見つけてしまうが見なかったことにしよう。

このコミットを見て、試しに手元のUbuntu(先日14.04にアップグレードしたばかり)で実験してみたら、再現しなかった。Ubuntuに入ってるのは2.16なので、それから2.18の間に退化しているらしい。

なので、両方のバージョンで実験してみようと思う。まずは、aというファイルを作って、各行に

  • ‘LJ’ (U+01C7 LATIN CAPITAL LETTER LJ)
  • ‘Lj’ (U+01C8 LATIN CAPITAL LETTER L WITH SMALL LETTER J)
  • ‘lj’ (U+01C9 LATIN SMALL LETTER LJ)

という文字を入れた。

grepのバージョン2.16と2.18の実行ファイルはそれぞれgrep-2.16, grep-2.18とする。あと、わかりやすいように、-iオプションの他に-nオプション(行番号表示)もつけた。以下、シェルの実行セッション:

$ cat a
LJ
Lj
lj
$ grep-2.16 -in 'LJ' a
1:LJ
2:Lj
3:lj
$ grep-2.16 -in 'Lj' a
1:LJ
2:Lj
3:lj
$ grep-2.16 -in 'lj' a
1:LJ
2:Lj
3:lj
$ grep-2.18 -in 'LJ' a
1:LJ
3:lj
$ grep-2.18 -in 'Lj' a
2:Lj
3:lj
$ grep-2.18 -in 'lj' a
1:LJ
3:lj

キ、キモいよ〜
っていうか、わけわかんないよ〜

ところで、’Lj’ (U+01C8 LATIN CAPITAL LETTER L WITH SMALL LETTER J)ってどんなときに使うんだろうか。詳しい人、教えてください。

3 thoughts on “grep: またUnicode周りでキモいコミット見つけた

  1. tai2

    この種の合字は、タイポグラフィでデザイン上の理由から使うものだと思います。慣習上、くっつく文字の組が決まってるようです。文字組をするときに合字を正しく使えないデザイナーはモグリだと思われるとかなんとか。文字「デザイン解体新書」っていう本で見ました。

    Reply

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です