unicode の大文字小文字は大変だなあ

ちょっと調べただけですが、面白かったのでメモ。世界は広いですね。バベルの塔ですね。

ß

ドイツ語では、ß (U+00DF 、エスツェット) を大文字にすると SS になるらしい。
鬼車 (RubyPHP で使われている正規表現エンジン) はこれに対応していて、ignore case にすると、一文字が複数の文字にマッチして驚く。

# coding: UTF-8
p "-SS-"[/-\u00DF-/i] #=> "-SS-"
p "-\u00DF-"[/-SS-/i] #=> "-\u00DF-"

こういう関係の字は他にもあるみたい。
ref: ftp://ftp.unicode.org/Public/UNIDATA/SpecialCasing.txt

İ と ı

トルコ語アゼルバイジャン語では i と I が別の字らしい。i の大文字は İ (U+0130 、点つきの I) で、I の小文字は ı (U+0131 、点なしの i) だそうな。ASCII の範囲でこういうことがおきるのは相当不幸ですね。
鬼車では USE_UNICODE_CASE_FOLD_TURKISH_AZERI を定義してビルドすることでトルコ語・アゼルバイジャン語モードに切り替えられるらしい (けど、試したことはないです) 。

DZ 、Dz 、dz

今年の LL で shinh さんが「Python の istitle() って何に使うんだろう」と言ってて、それの答えのひとつかどうかはわかりませんが、d と z をくっつけた字があるらしい。
リリースされたばかりの Python 3.0 で試すと、こんな感じだった。

isupper istitle islower upper title lower
DZ (U+01F1) True True False DZ Dz dz
Dz (U+01F2) False True False DZ DZ dz
dz (U+01F3) False False True DZ Dz dz

あれ、"Dz".title() が "DZ" になるのはバグような気がする……。
それはともかく、この文字を使うのはポーランド語やマケドニア語やスロバキア語やハンガリー語などみたいなんだけど、ポーランド語の wikipedia ですら使われてないような。わざわざ別の文字として登録する必要があったんだろうか。などと考えると、中国の漢字と日本の漢字で似てるやつを unify した外国人の気持ちがわかる。
uppercase と titlecase が異なる字としては、他にも DŽ と Dž 、LJ と Lj 、NJ と Nj が見つかった。
ref: ftp://ftp.unicode.org/Public/UNIDATA/UnicodeData.txt