※現在、ブログ記事を移行中のため一部表示が崩れる場合がございます。
順次修正対応にあたっておりますので何卒ご了承いただけますよう、お願い致します。

漢字の文字コードの確認


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))
七

ちゃんと動くようだ。

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