漢字を注音符号にするWebサービス(2)

広告

まずはコメントから。

POSTED BY 匿名 ON 2010年2月4日
とても面白そうですね。
DUOのような例文集の形も良いと思います。
労力がすごそうですが^^;
大学に進学したら中国語を学びたいと思っていたんで
完成の暁にはぜひ使わせていただきます。

ずいぶん幅広い層の方に読んで貰えているのですね。シーボの日記は受験生も読んでいるらしいけど。

はい、例文を作っていこうとするとかなり大変だと思います。それができたら、ちょっとした自慢になりそうですね。最初はフリーのWebサービスあたりから始めて、ちょっとした事業化できたらいいなと思っています。

メモがわり

まずUnicodeのどのあたりに中国語の文字があるかをここで調べる。

Chinese (All)なら簡単でいいのだけど、Traditional Chinese – Level 1だとずいぶん複雑になる。Traditional Chinese – Level 1というのは、Adobeのサイトによると基本的な5,000文字のセットらしい。これを手で処理すると面倒臭いので正規表現を使う。

.*?U+([0-9A-F]{4,4})-U+([0-9A-F]{4,4}).*?

for( int i = 0x$1; i <= 0x$2; i++ )

に置き換えればOK。これでC言語のfor文の形になったので、あとはUnicodeからUTF-8に変換するプログラムを書く。仕様を調べると

「こ」の例

「こ」の Unicode はコード表より 3053。
16 bit であらわすと 0011|0000|0101|0011。(ただし 4 bit 毎に | を記入。)
16 bitを 4, 6, 6 bit に分割すると 0011|000001|010011。(ただし分割する所に | を記入。)
4, 6, 6 bit の前にそれぞれ1110, 10, 10 を挿入すると 11100011|10000001|10010011。
16 進数であらわすと E3 81 93 という 3 bit になります。
HexEdit で開いたテキストファイルの最初の 3 バイトは「こ」の字をあらわしています。

そんなに難しくないので、ささっとコードを書く。

static void PutUnicode( int code, FILE *out )
{
	/**
	 「こ」の例
	 
	 「こ」の Unicode はコード表より 3053。
	 16 bit であらわすと 0011|0000|0101|0011。(ただし 4 bit 毎に | を記入。)
	 16 bitを 4, 6, 6 bit に分割すると 0011|000001|010011。(ただし分割する所に | を記入。)
	 4, 6, 6 bit の前にそれぞれ1110, 10, 10 を挿入すると 11100011|10000001|10010011。
	 16 進数であらわすと E3 81 93 という 3 bit になります。
	 HexEdit で開いたテキストファイルの最初の 3 バイトは「こ」の字をあらわしています。
	 
	 http://www.unicode.org/charts/
	 */

	static int counter = 0;
	int a, b, c;
	
	c = (code & 0x3f) | 0x80;
	code >>= 6;
	b = (code & 0x3f) | 0x80;
	code >>= 6;
	a = (code & 0x0f) | 0xe0;

	fputc( a, out );
	fputc( b, out );
	fputc( c, out );
	
	if( counter++ > 100 )
	{
		fputc( 'n', out );
		counter = 0;
	}
}

これで中国語に使われる文字が全て得られる。

一丁丂七丄丅丆万丈三上下丌不与丏丐丑丒专且丕世丗丘丙业丛东丝丞丟丠両丢丣两严並丧丨丩个丫丬中丮丯丰丱串丳临丵丶丷丸丹为主丼丽举丿乀乁乂乃乄久乆乇么义乊之乌乍乎乏乐乑乒乓乔乕乖乗乘乙乚乛乜九乞也习乡乢乣乤乥
书乧乨乩乪乫乬乭乮乯买乱乲乳乴乵乶乷乸乹乺乻乼乽乾乿亀亁亂亃亄亅了亇予争亊事二亍于亏亐云互亓五井亖亗亘亙亚些亜亝亞亟亠亡亢亣交亥亦产亨亩亪享京亭亮亯亰亱亲亳亴亵亶亷亸亹人亻亼亽亾亿什仁仂仃仄仅仆仇仈仉今介

(略)

黢黣黤黥黦黧黨黩黪黫黬黭黮黯黰黱黲黳黴黵黶黷黸黹黺黻黼黽黾黿鼀鼁鼂鼃鼄鼅鼆鼇鼈鼉鼊鼋鼌鼍鼎鼏鼐鼑鼒鼓鼔鼕鼖鼗鼘鼙鼚鼛鼜鼝鼞鼟鼠鼡鼢鼣鼤鼥鼦鼧鼨鼩鼪鼫鼬鼭鼮鼯鼰鼱鼲鼳鼴鼵鼶鼷鼸鼹鼺鼻鼼鼽鼾鼿齀齁齂齃齄齅齆齇
齈齉齊齋齌齍齎齏齐齑齒齓齔齕齖齗齘齙齚齛齜齝齞齟齠齡齢齣齤齥齦齧齨齩齪齫齬齭齮齯齰齱齲齳齴齵齶齷齸齹齺齻齼齽齾齿龀龁龂龃龄龅龆龇龈龉龊龋龌龍龎龏龐龑龒龓龔龕龖龗龘龙龚龛龜龝龞龟龠龡龢龣龤龥龦龧龨龩龪龫龬龭
龮龯

あとはどっかで漢字とピンインの変換テーブルでも探してきて、そこから注音符号にすればいい。

宿題やらないといけないので今日はここまで。