クメール文字を徹底的に解説する
ルール1
子音

に母音

を組み合わせることで、
一文字

を作る
丸い点線に注目
丸い点線で囲まれた中に前の文字(子音)の形がはいる
丸い点線がある母音を子音の後に入力する(逆では文字にならない)
前後左右どこにくっつかは母音の形と丸い点線の位置関係に注目すればわかる
ルール2
母音以外にも、前の文字にくっついて修飾する記号がいくつか存在する

など
ベースとなる文字には、母音も含めて複数の修飾記号がくっつきうる
ルール3

は特殊な文字で、後ろに続く子音も、合成できる
いわばワイルドカードの最強の結合材
ស +
្ +
ដ=

ユニコード表をみると、この記号だけ、四角い点線で囲まれているので、わかる
ハングルが分かる人なら、ハングルとほぼ同じだと思うとよさそう。
ハングルはもっともっと簡単なような...

分類上は、
アブギダ文字に分類され、世界の文字のうち約半分はアブギダらしい(ハングルはアブギダではない)
利点

の感想だが、
母音と
子音を組み合わせるのは合理的である
覚える形が少なくて済む
例えば、子音10、母音5で10x5=50音の表現するにのに、15形状覚えれば足りる
じっさい、キーボードも簡単そう
おさらい
は
になる
実装
MacOSの入力フォームでは完璧に動作している
適当なエディタでは、្以外は、ただしく動作している
正規表現には \p{M}
というマッチングがあって、修飾記号にマッチできるが、これも実装は、まちまちのようだ
Ruby製のものは、微妙だった
ちなみに、下の正規表現は、完璧に動作する
最新のUnicode表 (Unicode 6.0)に基づき、かつクメール文字の解説を読み込んだあとに作ったので間違いないはず
khmer.js// spec: https://www.unicode.org/charts/PDF/U1780.pdf
export const khmer = (() => {
const letter = '[\\u1780-\\u17FF]' // ベースとなる文字
const trailingLetter = '[\\u17B6-\\u17D1\\u17D3\\u17DD]' // 主に母音となるヘンの部分になる文字
const control = '\\u17D2' // 子音を合成する特殊な結合用の記号 ្
const pattern = `${letter}(${control}${letter}|${trailingLetter})*`
return pattern
})()
// sample = 'ច្រើនឡើងៗ'
// sample.match(new RegExp(khmer(), 'g'))
他の文字との比較
が、្があるものとないものがある
クメール文字は、្があるぶん難しいと言えるが、これに対応できれば横展開は容易である
全部一気には対応できない
しかたないようだ。
すごいnpmを探したがちょっと見当たらない
言語は変化するので
Unicodeの更新に対応する必要があるが、その手間が半端じゃない
プログラミング言語のハイライト機能のように要望に応じてちょっとづつやっていく?
考察
なんでこの方式を採用したのだろう?
ユニコード以前から、この方式だったようである
1 byteにすべて収めることができたので、これを採用したのだろう
組み合わせた文字の数だけ、codeを割り当てる方式(漢字風)を採用していた場合は、shift-JISのように、1byteと2byteの文字が発生するため避けたのでは
ユニコード後はどっちでもよいのでは?
ユニコードではcode数はほぼ無制限になったのでどっちの方式でもよさそう