漢字の文字コードの確認


2012年 11月 08日

Haskells.jpg

『関数プログラミング入門』 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))
七

ちゃんと動くようだ。

文字の演算をすると、色々おもしろいこともあるが、深入りは避けておこう。
日本語文字列も、やろうと思えばできるかな。