ものがたり(旧)

atsushieno.hatenablog.com に続く

ੴ 本当に歌うの??

グルムキー文字が見えない人ゴメンナサイ…ഛ

今日(25)は日の出ているうちはほとんどDateTimeみたいな雑務に費やしてしまったが、とりあえずcollationはまだ続けている。nonspacing markの順番は全く理解不能な上に、それほど文字の順番の重要度が高いとは思えないので後回しだ。ブヒൠ

というわけで今週は手っ取り早いChar.IsLetter(c) == trueな文字のprimary keyを埋める作業をしている。実際にはprimary equivalentな文字でもUCD (Unicode Character Database)の定めるdecompositionと合致しないところがある(先日ちこっと書いた)部分があって、それは大いに困るのだけど、まあとりあえず見なかったことにしている。

で、collationの命題として、一体どういう順番なんだよ?というのがそれぞれの文字カテゴリについて問題なわけで…

  • ギリシャ文字。どうも\u03CFまでと\u03D0から先は違う扱いっぽい。一方、UCAではちゃんと\u03D0\\u03DFまでを混ぜ合わせた順序になっているので、Windowsギリシャ文字の順序は時代遅れだと思って差し支えない。
  • \u03E0から先はコプト文字なのだけど、これはWindowsでは抜けている文字があるものの、ほぼ同じ。
  • キリル文字もよーわからん。いや、僕はロシア語を全く解さないので、それぞれの文字が何なのかは全く見当が付かないのだけど、それでも大部分の文字の並び順がkoi8ではなく(koi8ベースのUnicode codepointでもなく)UCAのDUCETに近いものであることは分かる。Windowsではどうも\u04D0から先は取り扱っていないっぽいことも分かる。\u0493や\u0495や\u0453が\u0433とprimary equivalentsであることもやや疑問ではあるが、まあ形は似ているのでOKとしよう*1。その他のサポートされていない文字群がUCA上2列どうも途中から並行して走っている感じなのだけど…。そして\u04B1だけ特別に「存在していることになっている」のがよく分からん…ってもう何言ってるのか意味不明ですね。この辺見ると↑のゆんゆんもちょっと解読できるかも。
  • アルメニア文字。基本的にcodepoint順。楽だー
  • ヘブライ文字。これもcodepoint。
  • アラビア文字。これはけっこう複雑そう(実はまだ終わっていない)。アラビア文字の範囲は\u0674以降とそれ以前の2パートに分かれていて、後者は単純にcodepointで並んでいる。前者は\u0601から\u0673までの順序ではなく、どうも見た感じ対応するUCDで言うところのPresentation Form B (\uFE80-\uFEFF)の並び順に基づいて並んでいるように見える。ただし「同じprimary weightをもつ文字」がちゃんとNFKDに基づく同値性に基づいているかという点が不明だ(というかここまで調べるだけで疲れた)。その後調べて分かった範囲では、多分基本的にはAbjadに基づいて並んでいて、ものによってはdiacritical markがくっついている文字がある。僕がUCDから流用できたのは文字名ARABIC LETTER XXX yyyの部分だけ。あるアラビア文字cp1について、同じXXXを名前に含むアラビア文字cp2がcp2<cp1の範囲にある(つまり前出)である場合は、そのprimary weightが使われる。
  • デーヴァナーガリ文字。実際には*Letter以外も並ぶが、ほぼcodepoint順。ただしsortkey値は4つおきの飛び石状態で、その辺の理由は僕はよく分かっていない。
  • ベンガル文字。これも*Letter以外が並ぶが、ほぼcodepoint順。
  • グルムキ文字。これはUCAと同じ並び順。ただし4の倍数で飛び石(理由は分からない)。
  • タミル文字。これはちょっと事情が複雑。まずUCAとWindowsの並び順は違う。UCAはUnicodeのcodepointに基づいて並んでいる。どうやらUnicodeのcodepointはあまりネイティブではないらしく、Windowsネイティブの文字順を意識して並べられている。素晴らしい。ただ、例の「文字符号の歴史」によると、後になってタミルナド政府では「イケてないUnicodeよりもっとネイティブなものを」ということでタミルネット99っていう文字符号表を提案していて、この順序では、サンスクリットの順序がWindowsと違うっぽい。
  • テルグ文字。ほぼcodepoint順、ただし3の飛び石。一部無視される文字がある。
  • カンナダ文字。これもほぼcodepoint順、3の飛び石、一部文字を無視。
  • マラヤーラム文字。codepoint順だった。インド人Umaが「あれはむつかしいわYO!」と言ってたのでビビってたのだけど。
  • タイ文字。母音と子音で区切りがある点を除けばほぼcodepoint通り。ただしいくつかの文字が無視されたりされなかったり。
  • ラオ文字。単純なcodepoint順。
  • グルジア文字。ほぼUCAどおりなのだけど、\u10E3と\u10F3の順番が違う。どちもたぶん誤差の範囲なのだろう(と信じたい)。

はぁ、疲れた。ここまでで調べるのに1昼夜くらいかかった。

codepoint的にはマラヤーラム文字とタイ文字の間に位置するシンハラ文字が、完全に抜け落ちているのは、意図的なのか、後出しで出てきたセットなのか、分からない。

*1:というか、もしかしたら昔はキリル文字の一部が本当にNFKD非正規形だったのかもしれない