- 実はさらに内部表現が
前記事では、
オモテに出ないまんどぅーか独自のローマナイズでソースのソースを書いて、
それをIMG SRCタグの洪水に変換する話を書いた。
では、ローマ字を直接タグに変えているかというとそうではない。
実はさらに内部表現があるのだ。
まんどぅーかのローマナイズはKH方式のAA研高島方言を改良しているわけだが、
はd、はd3、はd3hというふうに、
各字母の長さは字種によって1〜3文字という変動の幅をもつ。
こういうのは処理上非常に面倒なので、
変換プログラムではいったん各字母をすべて2桁の整数に変換するようにした。
これなら出力ルーチンではパッパッと2桁ずつ切り分けて処理することができる。
具体的には次のとおりである。
Unicodeは10進数表記にした上で、確認のため、
( )囲みでそのコードの前後に&#と;をつけて実際に表示してみた。
( )囲みの中はUnicodeフォントを入れない限り正しく表示されない。
また、母音記号のコードは直前にかぶせることを前提としているので、
より正しく表示できるよう、を補った。
Windows95/98/Meでは仮にUnicodeフォントを入れてあっても正常な表示は不可能である。
まずMS-IEでは?としか表示されないし、
NetscapeまたはMozilla Firefoxでは、
が左側に来なかったり、やなど上や下に来るべき記号が右に表示されてしまう。
あきらめてWindows2000/XPを使用してほしい。
文字 |
|
|
|
|
|
|
|
|
まんどぅーか式 |
aa |
ai |
au |
a |
ii |
i |
uu |
u |
内部コード |
02 |
11 |
13 |
01 |
04 |
03 |
06 |
05 |
Unicode(記号) |
2366( का ) |
2376( कै ) |
2380( कौ ) |
---- |
2368( की ) |
2367( कि ) |
2370( कू ) |
2369( कु ) |
Unicode(独立) |
2310( आ ) |
2320( ऐ ) |
2324( औ ) |
2309( अ ) |
2312( ई ) |
2311( इ ) |
2314( ऊ ) |
2313( उ ) |
文字 |
|
|
|
|
|
|
|
|
|
まんどぅーか式 |
r3 |
r4 |
l3 |
e |
o |
h3 |
m3 |
' |
m4 |
内部コード |
07 |
08 |
09 |
10 |
12 |
21 |
22 |
23 |
24 |
Unicode(記号) |
2371( कृ ) |
2372( कॄ ) |
2402( कॢ ) |
2375( के ) |
2379( को ) |
2307( कः ) |
2306( कं ) |
2365( ऽ ) |
2305( कँ ) |
Unicode(独立) |
2315( ऋ ) |
2400( ॠ ) |
2316( ऌ ) |
2319( ए ) |
2323( ओ ) |
文字 |
|
|
|
|
|
まんどぅーか式 |
kh |
k |
gh |
g |
n1 |
内部コード |
32 |
31 |
34 |
33 |
35 |
Unicode |
2326( ख ) |
2325( क ) |
2328( घ ) |
2327( ग ) |
2329( ङ ) |
文字 |
|
|
|
|
|
まんどぅーか式 |
ch |
c |
jh |
h |
n2 |
内部コード |
37 |
36 |
39 |
38 |
40 |
Unicode |
2331( छ ) |
2330( च ) |
2333( झ ) |
2332( ज ) |
2334( ञ ) |
文字 |
|
|
|
|
|
まんどぅーか式 |
t3h |
t3 |
d3h |
d3 |
n3 |
内部コード |
42 |
41 |
44 |
43 |
45 |
Unicode |
2336( ठ ) |
2335( ट ) |
2338( ढ ) |
2337( ड ) |
2339( ण ) |
文字 |
|
|
|
|
|
まんどぅーか式 |
th |
t |
dh |
d |
n |
内部コード |
47 |
46 |
49 |
48 |
50 |
Unicode |
2341( थ ) |
2340( त ) |
2343( ध ) |
2342( द ) |
2344( न ) |
文字 |
|
|
|
|
|
まんどぅーか式 |
ph |
p |
bh |
b |
m |
内部コード |
52 |
51 |
54 |
53 |
55 |
Unicode |
2347( फ ) |
2346( प ) |
2349( भ ) |
2348( ब ) |
2350( म ) |
文字 |
|
|
|
|
まんどぅーか式 |
y |
r |
l |
v |
内部コード |
56 |
57 |
58 |
59 |
Unicode |
2351( य ) |
2352( र ) |
2354( ल ) |
2357( व ) |
文字 |
|
|
|
|
まんどぅーか式 |
s2 |
s3 |
s |
h |
内部コード |
60 |
61 |
62 |
63 |
Unicode |
2358( श ) |
2359( ष ) |
2360( स ) |
2361( ह ) |
文字 |
|
|
|
|
|
|
|
|
|
|
まんどぅーか式 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
内部コード |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
Unicode |
2406( ० ) |
2407( १ ) |
2408( २ ) |
2409( ३ ) |
2410( ४ ) |
2411( ५ ) |
2412( ६ ) |
2413( ७ ) |
2414( ८ ) |
2415( ९ ) |
文字 |
|
|
|
|
|
|
|
|
|
|
|
|
|
まんどぅーか式 |
. |
, |
- |
! |
? |
; |
: |
( |
) |
~ |
+ |
$ |
% |
内部コード |
80 |
81 |
00 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
Unicode |
2404( । ) |
2405( ॥ ) |
|
2416( ॰ ) |
|
文字 |
|
|
|
まんどぅーか式 |
_ |
@ |
\ |
内部コード |
97 |
98 |
99 |
コード表で、最後の@と¥は、赤黒切り替えトグルと小文字大文字切り替えトグルなので、
文字としては出てこない。
それから_は、空白をまぜるためのもの。
ある理由で(後述する){ }の間にはスペースが混ぜられないので_で代用しているのである。
- デーヴァナーガリー順ソート
ところどころヘンな順序になっているのは、
変換ルーチンをより簡単にするためのものである。
つまり、文字列中でtという文字を発見したとして、
それは本当にtかもしれないし、th、t3、t3hなどかもしれないわけである。
このため先読みが必要になるわけだが、そのやりかたには、
- そこから3文字切り取って、テーブルサーチをする
- 見つからなければ、2文字切り取って、テーブルサーチをする
- 見つからなければ、1文字切り取って、テーブルサーチをする
という方法と、
- テーブルから機械的に3文字ずつ切り取ってきて、空白をつめた上で、解析する文字列の先頭とマッチングさせていく
という方法の2通りがある。
前者の方法でやれば、どんな順序で並んでいようと正しく解析できるが、
後者の方法では、テーブルがt th t3 th3 と並んでいると、たとえthやt3やt3hであっても先に最初のtにマッチしてしまう。
これを避けるために、テーブルの順序を変えて、
t3hのような長いキーワード(トークン)を先に持ってきているわけである。
今回は処理系の都合で、後者のやりかたのほうがラクにできそうだったので、
そこでテーブルのほうに工夫を加えたというわけである。
上で、{ }の中にはスペースがまぜられないといった理由は、
この後者の方法をとっているからである。
マッチングさせる際にはスペースを削除しているので、スペースを混ぜられないのだ。
内部コードはデーヴァナーガリーの順番である。
だから手元のサンスクリット語彙集データベースでは、
このルーチンをかまして内部コードに変換したフィールドを用意してある。
それをキーにして並べ替えると、デーヴァナーガリーの順序になってくれる。
ソートをするならUnicodeを使えばいいじゃないかと思うかもしれないが、
Unicodeの表を見てくれればわかるように(下の「関連サイト」のリンク。
または上の表)、
実はUnicodeを使うとデーヴァナーガリー順にならないのだ。
の独立形やの記号形がヘンなところに飛んでいたり、
結合子音をヴィラーマコード(2381)を使って表現しなければならないせいである。
だからやっぱりソートのためにも独自の内部表現が必要というわけである。
もっとも、本来はやがついたものは、
つかないものより前に出すのが普通なのだが、
このコードでは後になってしまう。
これに対応するのは非常に面倒なので勘弁してほしい。
表の最後の@と¥にもコードを割り当ててある。
すると、これらが入っているとコードが変わってしまい、
ソートがうまくできないことになる。
目下のところ、語彙集はすべて小文字で入れてあるので、
デーヴァナーガリー順にしなければならない局面でこれらが混じることはない。
仮に将来仕様変更して、語彙集にも大文字をまぜることがあったとしても、
あらかじめ¥を削除したものを内部コードにすれば問題ない。
内部コードのうち、−に00というコードを割り当てた理由は、
自分でもよく覚えていない。
たぶん、語彙集では−が入ることがひんぱんにあるので、
−が入っても入らなくても並びがあまり変わらないようにしようとしたのだろう。
もっともこれを言ったら、√に対応する%にもそういう処置をしなければならないはずだが、
そこらへんが不徹底である(笑)。
実際には−や√は削除した上でソートしているので、どういうコードを割り当ててもよかったのだけれどもね。
- 内部コードをUnicodeにする際の注意点
Microsoft Officeでデーヴァナーガリーを使うでも書いたように、
私はデーヴァナーガリーを打つときはキーボードから直接の入力をしていない。
上記のまんどぅーか式ローマ字で打ったものを変換させている。
ローマ字部分はどうせ入力しなければならず、
二度同じものを入力するのはばかばかしいし、
誤入力すると恥ずかしいからだ。
このときはまんどぅーか式ローマ字をいったん上記の内部コードにしたうえで、
上記の表をたよりに変えていくことになるが、
サンスクリットの場合は次の4つの注意事項がある。
- スペースの処理……いったん出力を保留する。
次の文字を処理するときに、前が子音でない(母音や記号)のときは出力する。
前が子音であれば何もしない。
- 記号と行末の処理……処理は1行単位で行う。
記号や行末では、その前が子音の場合にヴィラーマ(2381)を出力する。
- の処理……前が子音であれば何もしない。母音であれば独立形を出力。
- 結合子音処理……今の文字が子音であり、前が子音であれば、
ヴィラーマのコード(2381)を出力する。
以上のことに注意してHTMLを出力してやれば、
母音や結合子音をブラウザが適当に組み立てて表示してくれる。
ただしWindows95/98/Meではダメ。
- ウルドゥー、ヒンディー、パーリ語では
上記の表はあくまでサンスクリットのもの。
パーリ語ではの意味は母音でなく子音であり、との間に入ってくるので、
そう変更している。また、ウルドゥー、ヒンディーでは鼻母音が必要だし、
の意味が異なるので、この部分も変更している。
つまり、この内部表現は言語によって変えているのである。
統一してもいいのだが、それだとどうしても内部コードを1字母3文字にしなければならない。
実際にはこれらの言語が混在することはないので、
互換性を捨てて効率を重視している。
- 関連サイト
- Unicode デーヴァナーガリー コード表
|