ユニコード全20902字


2012年 11月 12日

『関数プログラミング入門』第3章 数値 なんだが、ごちゃごちゃ面倒なことが書かれていて、
読んでいると眠くなってきたので、適当に読み飛ばして、第4章リストで少し遊んでみよう。

プログラミングの本の読書とは、本はまあ普通に読んだり、読み飛ばしたりしながら、
本の趣旨とは違うことをやってみることだ。

haskellでは、無限リストが扱えるので、そのあたりが楽しいのだが、
無限リストは第9章になっている。

でも、この本、こんなものが載っているのだ。

from :: Integral a => a -> [a]
from n = n : from (n+1)

リストで再帰つかって、無限リストを作っているのだ。
で、試してみた。

*Main> from 0
[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85

延々と出てくるので、 C-c で止めるしかないのだ。

さて、また漢字に戻ろう。

漢字1文字を与えると、その文字コード以降の文字のリストを返す関数をでっちあげてみよう。
c を文字とすると、

chr ((ord c) + 1)

で次の文字になる。

これを使って、1文字を与えると、文字の無限リストを返す関数を書いてみた。
文字のリストは文字列なので、無限長の文字列を返すことであもある。

import Data.Char

nextK :: Char -> [Char]
fromK c = c :  fromK (chr ((ord c) + 1))

では早速確認

*Main> fromK '一'
"\19968\19969\19970\19971\19972\19973\19974
C-c

となって、数値表示が延々と続いてしまう。
これではいけないので、 putStrLn で、漢字表示にしてみよう。

*Main> putStrLn (fromK '一')
一丁丂七丄丅?万丈三上下丌不与?丐丑丒?且丕世丗
C-c

これできちんと表示されているのだが、ブラウザによっては、
日本のJISの文字にしか対応していない場合(ユニコード非対応)の場合には、
非対応文字は?での表示になったりする。

無限長文字列を書くのは現実的ではないので、先頭から指定文字数文だけを
取り出すことにしよう。
指定文字数ということは、リストの先頭から指定個数だけ抜き出したリストだ。

リストから n 個取り出すには、 take n list でよいので、やってみよう。

では、ちょっと遊んでみよう。

*Main> putStrLn (take 32 (fromK '一'))
一丁丂七丄丅?万丈三上下丌不与?丐丑丒?且丕世丗丘丙????丞丟

では、ちょっと遊んでみよう。

*Main> putStrLn (take 32 (fromK '漢'))
漢漣??漦??漩漪漫漬漭?漯漰漱漲漳??漶?漸??漻漼?漾漿?潁
*Main> putStrLn (take 32 (fromK '水'))
水氵氶氷永?氺氻??氾氿汀汁求???????汊汋?汍汎汏汐?汒?
*Main>

これで、ユニコードは部首順であるのが想像つくだろう。

ユニコードの漢字は、 '一' で始まり、20902文字がずっと連続しているのだ。
なので、

putStrLn (take 20902 (fromK '一'))

で、全ユニコード文字を表示できるのだ。
では早速実験してみよう。
最後の文字までちゃんと出るだろうか。

*Main> putStrLn (take 20902 (fromK '一'))
一丁丂七丄丅?万丈三上下丌不与?丐丑丒?且丕世丗丘丙????丞丟
.......................
龠龡龢龣?龥

となって、最後の文字「龥」までちゃんと表示された。
ブラウザによっては、文字によって、
綺麗な文字と汚い文字が混じっているかも知れないが。
でも、かなり待たされたのであった。