sci

最果て風呂

異体字セレクタ?

UTF 系の LaTeX を使えば漢字を手軽に扱えると思っていたら違った。取っ掛りとして葛飾区や葛󠄀城市の「葛」について調べてみることにした。

ウェブブラウザでの表示

  • ヒラギノ ProN フォントでは「人」の「葛」と表示される
  • ヒラギノ Pro フォントでは「ヒ」の「葛」と表示される

どちらも Unicode の割り当てが同じ U+845B なので、表示されるのはそのフォントの持っているグリフが表示されるのだとか。

異体字セレクタに対応しているウェブブラウザで、かつ ProN を使っている場合には下記のように記述すると好きな方を表示させることができる。

葛󠄀 ヒの方
葛󠄁 人の方

ProN では本則(何が?)のものがデフォルトで表示されるようになっているらしい。

普段使いのエディタでの表示

Cocoa Emacs では対応しているそうなのだが、丸ゴ ProN を使っている自分の環境では「人」の「葛」しか表示できていない。またターミナルで使うと「ヒ」の「葛」の方が表示されている。どういうこっちゃ?

フォントの設定を Osaka 等幅設定にしているからかも。だって等幅フォントこれしかないんだもん。Vim は ターミナルでしか使っていないので、異体字の表示は諦める。なかなか難しいもんだな。

Emacs での表示方法がわかった。下記のようにして C-xC-e を実行すると、閉じカッコの後ろに「辻󠄀辻󠄁」「葛󠄀葛󠄁」のように挿入される。

(insert ?辻 #xe0100 ?辻 #xe0101)辻󠄀辻󠄁
(insert #x8fbb#xe0100)辻󠄀
(insert ?葛 #xe0100 ?葛 #xe0101)葛󠄀葛󠄁
(insert #x845b#xe0100)葛󠄀

で、これを SKK 辞書に登録すると、変換候補にそのまま出てきてくれる。また、HTML に書いても(異体字セレクタ 󠄀 を付けなくても)そのまま表示される。フォントの設定が ProN だからね。

この前作ったプログラムで調べてみると、下記のようになっていた。

辻󠄀 の文字数は 2 で、バイト数は 7 です
232 190 187 243 160 132 128
 E8  BE  BB  F3  A0  84  80

辻󠄁 の文字数は 2 で、バイト数は 7 です
232 190 187 243 160 132 129
 E8  BE  BB  F3  A0  84  81

葛󠄀 の文字数は 2 で、バイト数は 7 です
232 145 155 243 160 132 128
 E8  91  9B  F3  A0  84  80

葛󠄁 の文字数は 2 で、バイト数は 7 です
232 145 155 243 160 132 129
 E8  91  9B  F3  A0  84  81

異体字セレクタというやつが、F3A08480 のように続いているんだね。1 文字なのに 2 文字としてカウントされちゃってる。プログラムがマズいんのかな(´・ω・`)ま、いわゆる合成文字になっていると考えればいいか。

ちなみに、SKK に登録されている素の「辻」と「葛」は一般的な UTF-8 コードだった。(何度も書くが)これは自分のヒラギノ丸ゴ ProN 環境では、それぞれ「2点辻」と「人葛」で表示されている。

辻 の文字数は 1 で、バイト数は 3 です
232 190 187
 E8  BE  BB

葛 の文字数は 1 で、バイト数は 3 です
232 145 155
 E8  91  9B

いや難しいわ。

(異体字セレクタを付加した単語を登録した後の現在は SKK 辞書には「3 バイトの 2点辻と、7バイトの 1点辻」「3 バイトの 人葛と、7バイトの ヒ葛」が登録されているぞ、ProN の場合)

Unicode と CID

TeX を使う時に、旧字体Emacs Lisp\UTF{} シーケンスに変換していたのだけど、葛や辻のようなものは CID{} シーケンスで指定してやらないと期待通りの表示にならなかった。それが今回のことを調べる切っ掛け。

UTF でも CID でも 扱えない字体があることがわかったので、自動化するのはあきらめよう。そもそもどの漢字を使うかは文脈によるので、どちらの字体を使うかを自動で処理することはできないもの。文章を読みながらいちいち指定してやる方がいいのかもしれないね。

これが参考になった。

ちょっと待てよ?

SKK 辞書には異体字セレクタ付きの文字が登録されている訳だが、もしこの文字に異体字セレクタを付加したらどんな表示になるのだろう?

eval してみると (invalid-read-syntax "?") というエラーになってしまった。たぶん 2 文字(合成文字?)なのでダメなんだろう。これは問題だぞ!だって環境によって表示される字体が異るのだから、今 3 バイトの文字なのか 7 バイトの文字なのか判別できないもの(私はターミナルの Vim も使う)。

HTML の方も問題があって、異体字セレクタ付きの文字(7バイト)に、さらに本来の意味の意味の異体字セレクタ(&#xE010x;)を付けても無視されてしまうのだ。「今入力している文字が 3 バイトなのか 7 バイトなのか……」が繰り返されるのであった。

Emacs の中だけで籠っているのなら良いけれど、LaTeX や HTML で出力することも頻繁にあるし、SKK 辞書は Vim とも共有しているので、不確定な不具合がいっぱい出てしまいそう。ということで、さっき登録したばかりの文字を辞書から削除した。これでいい。

  • Emacs では insert + eval を使って入力する。HTML に流用することがあるけど次の方法で回避する。
  • HTML では 葛󠄀辻󠄀 の記法を使って表現する。CSS でフォント指定するよりも、こちらの方が(ソースを見れば)意図が明らか。
  • TeX では(TeXLive が対応していないので) \CID{1481}\CID{7652} の CID を調べて使う。

という方針でいこうと思う。

おまけ

Pro と ProN の違いは「JIS90 と JIS2004 の違い」だそうだ。N が付くと、新しい基準の字体が使われることになるらしい。

フォント名の後ろに付く Std Pro Pr5 Pr6 の違いについて。アドビ様が決めて下さったものらしい。

(Adobe-Japan 1-0)   8284文字
(Adobe-Japan 1-1)   8359文字
(Adobe-Japan 1-2)   8720文字
(Adobe-Japan 1-3)   9354文字  Std
(Adobe-Japan 1-4)  15444文字  Pro  ↓ヒラギノ Pro だけは↓
(Adobe-Japan 1-5)  20317文字  Pr5  →   ココ!    ←
(Adobe-Japan 1-6)  23058文字  Pr6

いやもう、文字コードやら字体やら、カオスだわ。