「𠁣」の文字をどのようにキーボード入力するか
「𠁣」と「𠃛」の文字は、 権威ある中国の漢語辞典でも読みがわからないのだから、 拼音や読みがなを用いた漢字入力ができない。 そこでコード入力ということになる。
たとえば GNU Emacs 24 で「𠁣」の文字の上にカーソルを置いて
C-u C-x =
あるいは
C-u M-x what-cursor-position
とやると
(...)
character: 𠁣 (displayed as 𠁣) (codepoint 131171, #o400143, #x20063)
preferred charset: unicode (Unicode (ISO10646))
code point in charset: 0x20063
script: han
syntax: w which means: word
category: .:Base, C:2-byte han, L:Left-to-right (strong), c:Chinese, |:line breakable
to input: type "C-x 8 RET HEX-CODEPOINT" or "C-x 8 RET NAME"
buffer code: #xF0 #xA0 #x81 #xA3
file code: #xF0 #xA0 #x81 #xA3 (encoded by coding system utf-8-unix)
display: by this font (glyph code)
xft:-unknown-HanaMinB-normal-normal-normal-*-14-*-*-*-d-0-iso10646-1 (#xCB)
Character code properties: customize what to show
name: CJK IDEOGRAPH-20063
general-category: Lo (Letter, Other)
decomposition: (131171) ('𠁣')
(...)
うんぬんと出る。
したがって Emacs 上で「𠁣」を入力したければ、
C-x 8 RET 20063 あるいは
M-x insert-char とやって文字コード 20063 を書けばよい。
「𠁣」は Unicode の U+20063 にあり、「𠃛」は U+200db にあり、花園明朝Bフォント があれば表示できる。
X 上の Emacs で表示させるには
~/.emacs などに
(set-fontset-font
"fontset-default"
'unicode-sip
'("HanaMinB" . "iso10646-1"))
と書いておけばよい。
自分が持っているどのフォントが U+20063 のグリフを表示できるかを調べるには、
FreeType と fontconfig のある条件下で
#include <stdio.h>
#include <stdlib.h>
#include <ft2build.h>
#include FT_FREETYPE_H
int main(int argc, char *argv[]) {
FT_Library library;
FT_Face face;
FT_Error error;
FT_UInt present;
char *c = " ";
FT_ULong i = (FT_ULong) strtoul(argv[1], &c, 0);
error = FT_Init_FreeType(&library);
if(error) { printf("Init failure\n"); return 1; }
error = FT_New_Face(library, argv[2], 0, &face);
if(error) return 2;
error = FT_Select_Charmap(face, FT_ENCODING_UNICODE);
if(error) return 3;
present = FT_Get_Char_Index(face, i);
if(present != 0) {
printf("%s has: U+%X (%i)\n", argv[2], (unsigned int) i, present);
}
return 0;
}
というコードを書いて、たとえば check_glyph.c という名前で保存したらば、
gcc `pkg-config --cflags --libs freetype2` check_glyph.c
のようにしてコンパイルして作った a.out というバイナリをつかって、
for file in `fc-list :fontformat=TrueType | sed 's/: .*$//'`
do
a.out 0x20063 $file
done
などとやればよい。
これは
:fontformat=TrueType
などと指定して TrueType フォントファイルを検索対象にしているが、
Noto Sans CJK などの CFF 形式のファイルを検索するには、
:fontformat=CFF を指定する。
Unicode.org
の Unihan Database によると、ふたつとも康熙字典に載っていない字らしい。
uim によるコード入力
Emacs 上での入力に問題は無いが、 X 上でうごくアプリケイションに漢字を入力をするときにはどうすればよいか。
uim では m17n-lib に附属の unicode.mim というモジュールをつかって unicode のコード入力ができるが、
このモジュールは4桁の16進数すなわち BMP までしか対応していないので、
U+200db のような5桁の16進数コードの文字は入力できない。
単純な弥縫策としては、
m17n-db に含まれる unicode.mim に
--- m17n/unicode.mim
+++ m17n/unicode5.mim
@@ -1,4 +1,4 @@
-;; unicode.mim -- Input method for Unicode characters by typing character code
+;; unicode5.mim -- Input method for Unicode characters by typing character code
;; Copyright (C) 2003, 2004, 2005, 2006, 2008, 2009
;; National Institute of Advanced Industrial Science and Technology (AIST)
;; Registration Number H15PRO112
@@ -21,22 +21,22 @@
;; Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
;; Boston, MA 02110-1301, USA.
-(input-method t unicode)
+(input-method t unicode5)
-(description (_"Input method for Unicode BMP characters using hexadigits.
-Type C-u followed by four hexadecimal numbers [0-9A-Fa-f]
+(description (_"Input method for Unicode non-BMP characters using hexadigits.
+Type C-u followed by five hexadecimal numbers [0-9A-Fa-f]
of a Unicode character code.
"))
-(title "UNICODE")
+(title "UNICODE5")
(variable
(prompt (_"Preedit prompt
Prompt string shown in the preedit area while typing hexadecimal numbers.")
"U+"))
(command
- (start (_"Start Unicode
-Start typing hexadecimal numbers of Unicode character.")
+ (start (_"Start Unicode5
+Start typing hexadecimal numbers of Unicode non-BMP character.")
(C-U)))
(map
@@ -62,7 +62,7 @@
(1 (sub this 55)))
(set code (+ (* code 16) this))
(set count (+ count 1))
- (cond ((= count 4)
+ (cond ((= count 5)
(delete @<) (insert code) (shift init))))
(backspace (undo))))
のような修正をくわえた unicode5.mim というファイルをつくっておいて、
uim をビルドしなおせば、
m17n-unicode5
という5桁のコード入力用の入力方法が利用できるようになる。
4桁のコードならば従来の m17n-unicode を使えばよい。
uim-skk の辞書に登録
いちいちコード入力する手間をはぶくために、 適当な符牒を決めておいて、 SKK の変換辞書に登録しようと考えても駄目である。 というのもデフォルトの SKK の辞書は EUC-JP とその拡張(EUC-JIS-2004等)にもとづいた文字コードを前提にしているから、 たとえば「鷗」の字は辞書登録できても、 「𠃛」の字は不可能である。
このことは手っ取り早くたとえば python をつかって、
>>> u'鷗'
u'\u9dd7'
>>> u'鷗'.encode('euc_jp')
'\x8f\xec\xbf'
>>> u'𠃛'
u'\U000200db'
>>> u'𠃛'.encode('euc_jp')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'euc_jp' codec can't encode character u'\ud840' in position 0: illegal multibyte sequence
>>> u'閒'
u'\u9592'
>>> u'閒'.encode('euc_jp')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'euc_jp' codec can't encode character u'\u9592' in position 0: illegal multibyte sequence
>>> u'𪫧'
u'\U0002aae7'
>>> u'𪫧'.encode('euc_jp')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'euc_jp' codec can't encode character u'\ud86a' in position 0: illegal multibyte sequence
のようにして調べることができる。
すなわち SKK 辞書には、
仁賢紀にみえる「
もちろん「ひゃっけん」の読みで「百閒」、
また「はや」の読みで「𪫧怜」のような、
タグまじりの文字列で登録するぶんには何の問題もない。
そうすると uim-skk の辞書には /(concat "百閒\073")/ のような形で登録される。
これが嫌ならば uim-skk の辞書を UTF-8 化してしまえばよい。 以下は乱暴だが、てっとりばやく uim-skk を UTF-8 コードに変換する方法:
まず、
uim 1.8.6 の *.scm がインストールされている場所が
/usr/local/share/uim であるとすると、
uim-skk-1.8.6-utf8.patch.gz
を用意しておき、
cd /usr/local/share/uim for f in japanese-act.scm japanese-azik.scm japanese-custom.scm japanese-kzik.scm japanese.scm skk.scm skk-custom.scm do new=`echo $f | sed 's/\.scm$/-utf8.scm/'` iconv -f EUC-JP -t UTF-8 < $f > $new done zcat uim-skk-1.8.6-utf8.patch.gz | patch -p0 -b mv skk.scm skk.scm.orig && mv skk-utf8.scm skk.scm mv skk-custom.scm skk-custom.scm.orig && mv skk-custom-utf8.scm skk-custom.scm rm japanese-custom-utf8.scm.orig japanese-utf8.scm.orig skk-utf8.scm.orig
とやって必要な uim ライブラリの文字コードを UTF-8 に変更しておく。
同じことするのに uim の svn 版からコンパイルする場合は、
このパッチ (uim-svn.patch.gz) と
不足分のアイコンとを用意し、
Google Code
から
sigscheme-0.8.5.tar.bz2
を入手しておいて、
svn co https://github.com/uim/uim/trunk uim-svn cd uim-svn tar xf ../uim-svn-pixmaps-suppl.tar.gz tar xf ../sigscheme-0.8.5.tar.bz2 mv sigscheme-0.8.5 sigscheme zcat ../uim-svn.patch.gz | patch -p1 -b ./autogen.sh ./configure --without-mana --without-prime --with-skk --disable-emacs make su make install GTK_PATH=/usr/lib/gtk-3.0:/usr/local/lib/gtk-3.0 gtk-query-immodules-3.0 > /usr/lib/gtk-3.0/3.0.0/immodules.cache GTK_PATH=/usr/lib/gtk-2.0:/usr/local/lib/gtk-2.0 gtk-query-immodules-2.0 > /usr/lib/gtk-2.0/2.10.0/immodules.cache
などとやってインストールすればよい。
次に SKK-JISYO.L や SKK-JISYO.S やユーザ辞書をすべて、
上記の iconv コマンドを使うなどして UTF-8 のコードに変換しておく。
Emacs の DDSKK でもシステムの SKK-JISYO.L を使用している場合には、
DDSKK の設定ファイルに
(setq skk-jisyo-code 'utf-8)
と書いておいて、こちらも UTF-8 にしてしまったほうがよい。 またSKK辞書サーバを動かしている場合には、サーバ辞書も変換しておく。
あとは UTF-8 形式の個人辞書に
おうがいぜんしゅう /鷗外全集/ ろうかんぶんしゅう /瑯嬛文集/ うちだひゃっけん /内田百閒/ びしばし /𠁣𠃛/
などと身勝手な文字を登録すればよい。
いずれにしても「𠁣」の字の場合は、俗にいう
「
鄭碼および五筆インプットメソッド
ちなみに uim には部首の組み合わせによって5ストローク以内で入力する鄭碼輸入法 (ZhengMa input method) が含まれている。
たとえばこれで「閒」の字を書くには、
「門」が xd で、「月」が q だから、
xdq とするのである。
また「海鷗」を書くには、
v(氵)、
ma(𠂉)、
zy(毌) を組合せた vmzy で「海」が、
h(匚)、
j(口)、
rz(鳥) を組合せた hjjr で「鷗」が出る。
それで「𠁣」は
i(丨) と xb(彐) を組みあわせた ixb によって、
また「𠃛」は
h(匚はEを含む) と
i(丨) とで完結するので、
終端マーカの vv を付した hivv で入力することになっている。
部首と主要な文字のキーを記憶してしまえば、これは相当高速な入力方法であろう。
また uim にはこれと似たような 五筆字型輸入法 (WuBi 86) も用意されていて、
こちらは
「𠁣」が vhk で、
「𠃛」が gnnv で入力できるらしい。
