初代iMacでアラビア語を使う

Sun Jan 29 20:32:36 JST 2006 古いボンダイブルーのimacにOSXを入れて使っている。こんな低速マシンでも使う気になるのは,そのフォントの美しさのためだろう。 画面は小さいし蛍光灯の映り込みもある非平面。 テキストベースの処理でも遅さを感じてしまう。 でも,このきれいなフォントはWindowsには,まだマネできてない。
10.3ではTextEditがアラビア語に対応している。しかし10.2付属のTextEditでは,右から左への文章はうまく入力できない それにvimが好きなので,macでも使いたい。 それでvimに挑戦だが,設定は思ったよりも面倒だった。

□vim compile

windowsではgvimを利用しているがOSX10.2では対応はいまいち。 そこでターミナルからvimを利用することにした。 gvimについては香り屋のサイト またはmacvim.org Terminal の日本語設定とVimのコンパイルについては以下のサイト TerminalはもともとUnicodeクライアントなのでvimも対応させてコンパイルしてやれば問題ないはず。

□font install

ところがこれがあまりよくない。 arabicshapeをきちんと再現できないし,カーソルの移動もwinwordなどのワープロ風のへんな動き。 フォントのせいなのかと思って,アラビア語の固定幅フォントをいろいろ探して入れてみるがどれもうまくいかない。 結局のところ,フォントは関係なくてターミナルの問題だったのだけど,比較的よくできていたのがjava付属のLucida Sans Typewriterだった。

□jTerminal setting

linuxで韓国語の専用ターミナルhantermというのがある。 そこで,アラビア語の専用ターミナルもあるかと思って探していたらjTerminal発見。日本語の使えない10.1時代の遺物かと思っていたらUnicodeにも対応していてビックリ。 jtermのEncodeをutf-8すると,vimは見事にアラビア語を表示してくれた。おまけにフォントはOsaka-monoのままでも大丈夫とは。 しかし,日本語はeuc-jpでの入力はできないようだ。 日本語のutf-8にしてしまえば問題ないので,Unicodeに統一して使うことにしてみる。 フォントの設定はOsaka-monoでは難しかった。アラビア語は可変幅フォントが適用されて表示が乱れる。やはり,Lucida Sans Typewriter が安定している。こちらは逆に日本語で多少乱れもある。日本語はOsakaが安定している。 ちなみにjTermはフォントをかえたときの再描画がいまいち。すくなくともvimを使っているときはかえないほうがよさそう。 about Terminal about iTerm

about gvim

macのgvimはwindowsのものほどは完成度が高くない。 OS10.2用では香り屋の6.2と本家6.3がある。 どちらもsjisとeuc-jpが使えるが,utf-8は使えない。 動きは端末版に比べて軽快だがUnicodeが使えないのが惜しい。 また端末版はdos改行のファイルを読むとフリーズしてしまう。 アラビア語を使わないならgvim6.3のほうが問題が少ないだろう。

□perl script

さてvimが使えるようになったので,自作のスクリプトが使えるようになった。 ローマ字入力をアラビア文字に変換できるようにしたもので, ThinkPadがクラッシュする前に一度作っていたのだが 今回再度作ってみた。 アラビア語のキーマップはなかなか覚えられないので, これがないとアラビア語を書くことが難しかった。 perl5.8だと文字列をs///で置換するだけでよかったのだが OSX10.2のperlはバージョンが低いv5.6.0 ので substrで1文字ずつ変換していかないとうまくUnicode出力してくれない。 ActivePerlで試したところ5.8以降はうまくいくようだ。 JUSCOのレジにある両替えお断りの掲示を試し打ち。

من فضلك لا تبدل الاموال الورقية بالعملة

とりあえずうまくいったようだ。

スクリプトの特徴。

シャクルには対応していない。 アラビア語のローマ字表記についてはNHKラジオ講座 新妻氏の表記を基本として多少変更している。 をそれぞれ当てている。 スクリプトのソースは以下。 ------------

%rr2x=(
'th'	,0x62b,
'kh'	,0x62e,
'dh'	,0x630,
'sh'	,0x634,
'Dh'	,0x638,
't_'	,0x629,
'~a'	,0x622,
'`a'	,0x623,
'`w'	,0x624,
'`i'	,0x625,
'`y'	,0x626,
'y_'	,0x649,
);
%r2x=(
'0'	,0x660,
'1'	,0x661,
'2'	,0x662,
'3'	,0x663,
'4'	,0x664,
'5'	,0x665,
'6'	,0x666,
'7'	,0x667,
'8'	,0x668,
'9'	,0x669,
','	,0x60c,
'?'	,0x61f,
'`'	,0x621,
'a'	,0x627,
'b'	,0x628,
't'	,0x62a,
'j'	,0x62c,
'H'	,0x62d,
'd'	,0x62f,
'r'	,0x631,
'z'	,0x632,
's'	,0x633,
'S'	,0x635,
'D'	,0x636,
'T'	,0x637,
'A'	,0x639,
'g'	,0x63a,
'f'	,0x641,
'q'	,0x642,
'k'	,0x643,
'l'	,0x644,
'm'	,0x645,
'n'	,0x646,
'x'	,0x647,
'w'	,0x648,
'y'	,0x64a
);
@ustr = ();
while(<>){
	$buf = $_;
	$i = -1;
	while($i++ <length($buf) ){
		if ($rr2x{substr($buf,$i,2)})
		{
			print (chr($rr2x{substr($buf,$i,2)})) ;
			$i++;
			#@ustr=(@ustr , chr($r2x{substr($buf,$i,1)}));
		}
		elsif ($r2x{substr($buf,$i,1)})
		{
			print (chr($r2x{substr($buf,$i,1)})) ;
			#@ustr=(@ustr , chr($r2x{substr($buf,$i,1)}));
		}
		else
		{
			print(substr($buf,$i,1));
		}
	}
	print "\n" ;
}