sci

最果て風呂

異体字セレクタ対策

正仮名クラスタを自称する人の文章で、旧仮名使いをうまく変換できないものがありました。どうやら異体字を実現するために文字に IVS を付加しているようです。

旧字旧仮名変換スクリプト mto は、旧字旧仮名から新字新仮名へ変換する場合に、一旦、新字旧仮名に変換し、さらに新字新仮名へと二段階で変換する(これは辞書の都合上しかたない)のであります。

今回のケースでは、第一段での変換において、異体字セレクタが付いている漢字を変換することが出来ないため、続く仮名使いの変換においてヒットしなくなってしまう、というわけですね(厳密に言うと単漢字ではない、熟語や送り仮名つきのものがダメになってしまう)。

これに対応するのは面倒そう……。相互変換をする場合は、前に持っていた IVS (の種類と位置)を記憶する必要があるから。旧字体から新字体への変換だけで良いのであれば IVS を削除するだけなのでいけそう。どうしようかなぁ。

Ruby や Python3 等では問題ないとして、そもそも JavaScript ってバイナリ扱いで F3A08480 の削除とか出来るのかしら?

ここで「違󠄂ふ」について実験してみます。ちなみに Osaka フォントだと一点之繞で、Hiragino ProN フォントだと二点之繞で見えています。包摂がアレなのだけれども、ウェブで使うなら明示的に 󠄁 とか付けた方がいいのに。異体字セレクタを使うと意図せず「隠微する」ことになっちゃいますから。

これを自作の C プログラムで見てみると下記のようになっていました(od -tu1, od -tx1 とかでもいいけど)。

違󠄂ふ の文字数は 3 で、バイト数は 10 です
233 129 149 243 160 132 130 227 129 181 
 E9  81  95  F3  A0  84  82  E3  81  B5 

もう少し分けてみると下記のようになります。

IVS
#x9055 #xE0102 #x3705
233 129 149 243 160 132 130 227 129 181
E9 81 95 F3 A0 84 82 E3 81 B5

ここから IVS の部分(F3A08482)を除けば、mto でも変換することができるテキストデータとなりますね。

あかん、JavaScript は一年前に触ったきりで忘れとるわ……。調べ方が悪いのか、C と同じようなことをしているものばかりがヒットしてしまいます。難しく考えず、お手軽に encodeURIComponent でバラして "%F3%A0%84%80" 等を削除して decodeURIComponent で戻す方法で実装することにしました。

「違󠄂(二点)ふ → 違(一点)ふ → 違う」となります。

旧字体や旧仮名使いを変換する前に、テキストエリアにある文字列を deleteIVS(str) でいじって、replaceStrings() でもてあそぶって感じでしょうか。異体字を扱う・扱わないをオプションにするか迷いましたけれども、関数に組み込んで強結合することに。プログラムを組むうえで悪い見本ですね。

たいした問題ではないのですけれど、削除するセレクタの部分(xE0100, xE0101...)は "%F3%A0%84%85" までとしました。渡辺さんの「辺」なんて数十もあるので、やってられませんわ(その前にフォントが対応してなくて表示できなというのもあります)。

とりあえずこんなんでええんちゃうか?面倒やし、何だか作者の思いを踏み躙るようで悪いし、JavaScript での実装だけにしたわ。

調べていて一年前に自分が書いた「異体字セレクタ?」を参考にしたのは内緒です。もの忘れが酷くなりました。

追記

異体字セレクタモンゴル文字向けが U+180B, U+180C, U+180D の 3 個。また「汎用の」異体字セレクタが U+FE00 から U+FE0F までの 16個と、U+E0100 から U+E01EF までの 240 個あり、漢字は後者のものを使うことになっているそうです。

UTF-8 のシークエンスではどうなるのかなぁ。F3A08480 から F3A0856F までというこになる(合ってるかな)?これなら for で回すよりも正規表現を使えば漏れもなく速いかもしれません。でも JavaScript って正規表現使えたかしら?一年前に自分で調べていましたよ(;_;)

Ruby のように /%F3%A0%84%8[0-9|A-F]/ こんな感じで使えるようですね。異体字セレクタを全部表すにはどうすればいいのかしら?これ以上複雑になるとわからなくなってしまうので、上記の 16 個だけヒットすることで満足します。

実験中に渡邉(#x9089)さんや渡邊(#x908a)さんがすべて渡辺(#x8fba)さんになってしまい、なんで?と不思議に思ったのですが、これは異体字セレクタうんぬんではなく、変換辞書(kanji-jisyo)に登録していたからでした(^_^;)

それにしても…… Osaka フォントで見ると違いがまったくわかりません。Hiragino ProN も OS 付属の簡易版だからかでしょうか、一点二点の之繞の違い、白か自の違い、ウ冠かワ冠の違い、八かハかルの違いしかわかりません(あ、でも 2x2x2x3 で単純に 24 種類あるの?)。

80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E
邉󠄀 邉󠄁 邉󠄂 邉󠄃 邉󠄄 邉󠄅 邉󠄆 邉󠄇 邉󠄈 邉󠄉 邉󠄊 邉󠄋 邉󠄌 邉󠄍 邉󠄎
邊󠄀 邊󠄁 邊󠄂 邊󠄃 邊󠄄 邊󠄅 邊󠄆 邊󠄇