『関数プログラミング入門』 2.2 文字 のところをで文字処理が若干書かれているが、漢字(Unicode)に限ってちょっといじってみた。
新しいGHCiでは、漢字に対応している、というかUnicodeに対応しているようなので、もうちょっと確認してみた。
漢字を文字および文字列として表示してみると、次のようになる。
Prelude> show '一'
"'\\19968'"
Prelude> show "漢字"
"\"\\28450\\23383\""
Prelude>
ユニコードの10進数表示で出てきてしまった。
文字として、そのまま表示すのに putChar
, putStrLn
を使ってみた。Ln
をつけると、予想通り改行される。
Prelude> putChar '一'
一Prelude> putStrLn "漢字"
漢字
では、 '一'
を数字に直してみようということで、ordを使ってみた。
すると、
Prelude> ord '一'
<interactive>:10:1:
Not in scope: `ord'
Perhaps you meant one of these:
`odd' (imported from Prelude), `or' (imported from Prelude)
となって、 ord
など存在しないと叱られた。
Prelude> import Data.Char
Prelude Data.Char> ord '一'
19968
Data.Char
をインポートしてからやると、ちゃんと10進整数表示になった。
chr
で元の文字に戻してみよう。
Prelude Data.Char> chr (ord '一')
'\19968'
しかし、これでは文字が数字になって出るだけで訳が分からない。
文字出力の putChr
を使ってみよう。
Prelude Data.Char> putChar (chr (ord '一'))
一
確かに元に戻せている。
さて、数字に直せるということは、ユニコード上の次の漢字を出すなどできるはずだ。
ということで、 '一'
より文字コードが3だけ大きい文字を調べてみよう。
Prelude Data.Char> putChar (chr (ord '一' + 3))
七
'一'
の3つ先の文字は、四かと思ったら七になってしまった。
大丈夫か?
実は、文字コードの指定に、16進数表記も使える。
コードを直接指定するのはこちらの方が便利である。
ということで、同じことをやってみた。
Prelude Data.Char> putChar (chr (ord '\x4e00' + 3))
七
ちゃんと動くようだ。
文字の演算をすると、色々おもしろいこともあるが、深入りは避けておこう。
日本語文字列も、やろうと思えばできるかな。