at_yasu's blog

ロード的なことを

モンゴル語とMacOS

Running mn.pl


モンゴル語を表示させるプログラムを、Perlで作ってみた。


現在のMacOSX(10.4.9)では、モンゴル語のフォントも用意されている・・・みたい。と、云うかSTFangsong,STHelti, STKalti, STSongというフォントにそれぞれ入っている。そして、Unicode3.0からはモンゴル語が対応されている*1

そういう事で、Unicodeの勉強も兼ねてターミナルで動かす簡単なプログラムをPerlで作ってみた。


使い方もプログラムも(多分)単純な作りになっている。アルファベットを打ち込んだら、適当なモンゴル語を表示させると云う形で動作する。
ただし、あたしは日本人だからモンゴル語の発音を知らないため、モンゴル語のローマ字を入れても期待したモンゴル語が出てくると云う事ではない。


そのアルファベットとモンゴル語の対応は、数字以外はunicode表にある名前から推測して勝手に決めている。例えば、Unicodeの1820「ᠠ」では、名前は「MONGOLIAN LETTER A」となっている。名前にある最後のアルファベットから、「a」を入力すると「ᠠ」と表示する様になっている。

数字はそのままで、「0」が「᠐」となる。


一応、起動した後、dumpと入力すると、「コマンド モンゴル語 意味」といった感じでヘルプみたいなのを表示します。見づらいけど。


現在の所、「᠀」「0x1800」から「´e」「0x180e」までの文字は対応していない。
と云うのも、このあたりのUnicode Character 'MONGOLIAN BIRGA' (U+1800)のフォントとMacOSXのフォントが違うからとりあえず放っておこうというのと、特殊文字なためどう入力するのが自然なのかちょっとわからなかった。


以下使用例。

[negro: ~/perls][17:48] $ ./mn.pl
agzh agss aga a e se lha
ᢕᢔᢇᠠᠡᡝᡀ


問題としては、モンゴル語の字が小さくて見えにくいんだよなぁ・・・:-(
連続した数字「00」は「᠐᠐」とは表示されません。単なるあたしのずぼらなせいです。
後、どうもこのフォントは縦書き専用みたいだから、首を右に90度傾けないと駄目らしい。そう考えると、入力した順番に処理するんじゃなくて、入力したお尻の方から表示しないと駄目っぽい。


以下、スクリプト

#!/usr/bin/perl -wT
use strict;
use utf8;

binmode(STDOUT, ":utf8");

# Create Map
%main::map = ();

# 参考サイト:http://www.fileformat.info/info/unicode/
#           http://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%B3%E3%82%B4%E3%83%AB%E8%AA%9E
#           http://itako999.blog41.fc2.com/blog-entry-77.html
#           http://www.rwds.net/kuroita/program/Perl_unicode.html

# Deget Key Map
my @_degit_array = ('0'..'9');

# Degit
create_mn_map(0x1810, @_degit_array);
# Letter Code
create_mn_map(0x1820, get_mn_letter_code());
# Letter Code ALI(after 1880)
create_mn_map(0x1880, get_mn_letter_code_ALI());

# add command
add_command();

while (<>) {
    chop(); s/[\r\n]//g;

    my @input = split /\W/, $_;

    while ($#input >= 0) {
	my $c = shift @input;
	if (exists($main::map{$c})) {
	    print $main::map{$c};
	}
    }

    print "\n";
}

##########################################################################
sub create_mn_map {
    my ($start_code,@key) = @_;
    my $i = 0;

    for (@key) {
	my $k = ($_ =~ m{[a-zA-Z]+}x) ? lc $_ : $_;
	$main::map{$k} = chr($start_code + $i);
	$i++;
    }
}

sub get_mn_letter_code {
# Letter Code.
# A    = 1820
# CHI  = 1842
# LVS  = 1843
# TDZA = 185C
# SE   = 185D
# SZHA = 1872
# MI   = 1873
# MZHA = 1877

    return ('A','E','I','O','U','OE',
	    'UE','EE','NA','ANG','BA','PA','QA','GA',
	    'MA','LA','SA','SHA','TA','DA','CHA','JA',
	    'YA','RA','WA','FA','KA','KHA','TSA','ZA',
	    'HAA','ZRA','LHA','ZHI','CHI',

	    'LVS',"TE","TI","TO","TU","TOE","TUE","TANG","TBA","TPA",
	    "TQA","TGA","TMA","TTA","TDA","TCHA","TJA","TTSA",
	    "TYA","TWA","TKA","TGAA","THAA","TJIA","TNIA","TDZA",

	    "SE","SI","SIY","SUE","SU","SANG","SKA","SGA",
	    "SHA","SPA","SSHA","STA","SDA","SJA","SFA","SGAA",
	    "SHAA","STSA","SZA","SRAA","SCHA","SZHA",

	    "MI","MKA","MRA","MFA","MZHA",
);
}

sub get_mn_letter_code_ALI {
# AGAO = 1880
# AGAH = 1897
# TAGT = 1898
# AGDAGA = 18a9
    return ("AGAO","AGVO","AGD","AGU","AGIU","AGB","AGTB",
	    "AGA","AGI","AGKA","AGN","AGC","AGT","AGTT","AGDD",
	    "AGN","AGTA","AGDA","AgPA","AGPH","AGSS","AGZH","AGZA","AGAH",

	    "TAGT","TAGZ","MAGG","MAGN","MAGC","MAGJ","MAGT","MAGDD","MAGTA",
	    "MAGDHA","MAGSSA","MAGCYA","MAGZHA","MAGZA",

	    "AGHU","AGHY", "MAGB", "AGDAGA"
);

}

##########################################################################
sub add_command {
    my %rev_map = reverse %main::map;
    my $string  = "show to mongolian font and keyword\n";

    while (<DATA>) {
	chop; s/[\r\n]//g;
	my ($mn,$mean) = split /\t/;
	$mn = chr(hex($mn));
	$string .= $rev_map{$mn}." ".$mn." " . $mean."\n"
	    if exists $rev_map{$mn};
    }

    $main::map{dump} = $string;
}

__DATA__
1820	MONGOLIAN LETTER A
1821	MONGOLIAN LETTER E
1822	MONGOLIAN LETTER I
1823	MONGOLIAN LETTER O
1824	MONGOLIAN LETTER U
1825	MONGOLIAN LETTER OE
1826	MONGOLIAN LETTER UE
1827	MONGOLIAN LETTER EE
1828	MONGOLIAN LETTER NA
1829	MONGOLIAN LETTER ANG
182A	MONGOLIAN LETTER BA
182B	MONGOLIAN LETTER PA
182C	MONGOLIAN LETTER QA
182D	MONGOLIAN LETTER GA
182E	MONGOLIAN LETTER MA
182F	MONGOLIAN LETTER LA
1830	MONGOLIAN LETTER SA
1831	MONGOLIAN LETTER SHA
1832	MONGOLIAN LETTER TA
1833	MONGOLIAN LETTER DA
1834	MONGOLIAN LETTER CHA
1835	MONGOLIAN LETTER JA
1836	MONGOLIAN LETTER YA
1837	MONGOLIAN LETTER RA
1838	MONGOLIAN LETTER WA
1839	MONGOLIAN LETTER FA
183A	MONGOLIAN LETTER KA
183B	MONGOLIAN LETTER KHA
183C	MONGOLIAN LETTER TSA
183D	MONGOLIAN LETTER ZA
183E	MONGOLIAN LETTER HAA
183F	MONGOLIAN LETTER ZRA
1840	MONGOLIAN LETTER LHA
1841	MONGOLIAN LETTER ZHI
1842	MONGOLIAN LETTER CHI
1843	MONGOLIAN LETTER TODO LONG VOWEL SIGN
1844	MONGOLIAN LETTER TODO E
1845	MONGOLIAN LETTER TODO I
1846	MONGOLIAN LETTER TODO O
1847	MONGOLIAN LETTER TODO U
1848	MONGOLIAN LETTER TODO OE
1849	MONGOLIAN LETTER TODO UE
184A	MONGOLIAN LETTER TODO ANG
184B	MONGOLIAN LETTER TODO BA
184C	MONGOLIAN LETTER TODO PA
184D	MONGOLIAN LETTER TODO QA
184E	MONGOLIAN LETTER TODO GA
184F	MONGOLIAN LETTER TODO MA
1850	MONGOLIAN LETTER TODO TA
1851	MONGOLIAN LETTER TODO DA
1852	MONGOLIAN LETTER TODO CHA
1853	MONGOLIAN LETTER TODO JA
1854	MONGOLIAN LETTER TODO TSA
1855	MONGOLIAN LETTER TODO YA
1856	MONGOLIAN LETTER TODO WA
1857	MONGOLIAN LETTER TODO KA
1858	MONGOLIAN LETTER TODO GAA
1859	MONGOLIAN LETTER TODO HAA
185A	MONGOLIAN LETTER TODO JIA
185B	MONGOLIAN LETTER TODO NIA
185C	MONGOLIAN LETTER TODO DZA
185D	MONGOLIAN LETTER SIBE E
185E	MONGOLIAN LETTER SIBE I
185F	MONGOLIAN LETTER SIBE IY
1860	MONGOLIAN LETTER SIBE UE
1861	MONGOLIAN LETTER SIBE U
1862	MONGOLIAN LETTER SIBE ANG
1863	MONGOLIAN LETTER SIBE KA
1864	MONGOLIAN LETTER SIBE GA
1865	MONGOLIAN LETTER SIBE HA
1866	MONGOLIAN LETTER SIBE PA
1867	MONGOLIAN LETTER SIBE SHA
1868	MONGOLIAN LETTER SIBE TA
1869	MONGOLIAN LETTER SIBE DA
186A	MONGOLIAN LETTER SIBE JA
186B	MONGOLIAN LETTER SIBE FA
186C	MONGOLIAN LETTER SIBE GAA
186D	MONGOLIAN LETTER SIBE HAA
186E	MONGOLIAN LETTER SIBE TSA
186F	MONGOLIAN LETTER SIBE ZA
1870	MONGOLIAN LETTER SIBE RAA
1871	MONGOLIAN LETTER SIBE CHA
1872	MONGOLIAN LETTER SIBE ZHA
1873	MONGOLIAN LETTER MANCHU I
1874	MONGOLIAN LETTER MANCHU KA
1875	MONGOLIAN LETTER MANCHU RA
1876	MONGOLIAN LETTER MANCHU FA
1877	MONGOLIAN LETTER MANCHU ZHA
1880	MONGOLIAN LETTER ALI GALI ANUSVARA ONE
1881	MONGOLIAN LETTER ALI GALI VISARGA ONE
1882	MONGOLIAN LETTER ALI GALI DAMARU
1883	MONGOLIAN LETTER ALI GALI UBADAMA
1884	MONGOLIAN LETTER ALI GALI INVERTED UBADAMA
1885	MONGOLIAN LETTER ALI GALI BALUDA
1886	MONGOLIAN LETTER ALI GALI THREE BALUDA
1887	MONGOLIAN LETTER ALI GALI A
1888	MONGOLIAN LETTER ALI GALI I
1889	MONGOLIAN LETTER ALI GALI KA
188A	MONGOLIAN LETTER ALI GALI NGA
188B	MONGOLIAN LETTER ALI GALI CA
188C	MONGOLIAN LETTER ALI GALI TTA
188D	MONGOLIAN LETTER ALI GALI TTHA
188E	MONGOLIAN LETTER ALI GALI DDA
188F	MONGOLIAN LETTER ALI GALI NNA
1890	MONGOLIAN LETTER ALI GALI TA
1891	MONGOLIAN LETTER ALI GALI DA
1892	MONGOLIAN LETTER ALI GALI PA
1893	MONGOLIAN LETTER ALI GALI PHA
1894	MONGOLIAN LETTER ALI GALI SSA
1895	MONGOLIAN LETTER ALI GALI ZHA
1896	MONGOLIAN LETTER ALI GALI ZA
1897	MONGOLIAN LETTER ALI GALI AH
1898	MONGOLIAN LETTER TODO ALI GALI TA
1899	MONGOLIAN LETTER TODO ALI GALI ZHA
189A	MONGOLIAN LETTER MANCHU ALI GALI GHA
189B	MONGOLIAN LETTER MANCHU ALI GALI NGA
189C	MONGOLIAN LETTER MANCHU ALI GALI CA
189D	MONGOLIAN LETTER MANCHU ALI GALI JHA
189E	MONGOLIAN LETTER MANCHU ALI GALI TTA
189F	MONGOLIAN LETTER MANCHU ALI GALI DDHA
18A0	MONGOLIAN LETTER MANCHU ALI GALI TA
18A1	MONGOLIAN LETTER MANCHU ALI GALI DHA
18A2	MONGOLIAN LETTER MANCHU ALI GALI SSA
18A3	MONGOLIAN LETTER MANCHU ALI GALI CYA
18A4	MONGOLIAN LETTER MANCHU ALI GALI ZHA
18A5	MONGOLIAN LETTER MANCHU ALI GALI ZA
18A6	MONGOLIAN LETTER ALI GALI HALF U
18A7	MONGOLIAN LETTER ALI GALI HALF YA
18A8	MONGOLIAN LETTER MANCHU ALI GALI BHA
18A9	MONGOLIAN LETTER ALI GALI DAGALGA

*1:全部かどうかは知らない。中の人頑張って:)