2008-09-30
GHC と UTF-8
コードへの埋め込み
str = " システム "
どう扱っているのか、確かめてみます。
import Data.Char map ord str → [32,12471,12473,12486,12512,32]
Char は1バイトではなく、UTF-8 の文字が収容できる大きさになっているようです。うまくできていますね。
UTF-8 ファイルの読み込み
UTF-8 で " システム " と書いたファイルを用意し、以下のコードを実行して、読み込ませます。
main = do cs <- getContents print $ map ord cs
結果は、こうなりました。
→ [32,227,130,183,227,130,185,227,131,134,227,131,160,32]
単なるバイトストーリムとして扱っているのが分ります。
ここで、以下のような先頭と末尾の空白を削るコードを考えます。
import Data.Char strip = reverse. dropWhile isSpace . reverse . dropWhile isSpace main = do cs <- getContents print $ map ord $ strip cs
このコードは、以下のように問題を起こします。
→ [227,130,183,227,130,185,227,131,134,227,131]
「ム」の3バイト目である 160 が削られています。原因は、isSpace が Non-breaking space (160) に対し、True を返すからです。
これを解決するためには、utf8-string というパッケージを入れるとよいようです。
import Data.Char import qualified System.IO.UTF8 as U8 strip = reverse. dropWhile isSpace . reverse . dropWhile isSpace main = do cs <- U8.getContents print $ map ord $ strip cs
実行すると、こうなります。
→ [12471,12473,12486,12512]
まとめ
トラックバック - http://d.hatena.ne.jp/kazu-yamamoto/20080930/1222744635
リンク元
- 35 http://www.mew.org/~kazu/
- 25 http://reader.livedoor.com/reader/
- 17 http://tc.tis.co.jp/
- 15 http://gmail.1o4.jp/imap.html
- 14 http://search.yahoo.co.jp/search?p=文章の書き方&search.x=1&fr=top_ga1&tid=top_ga1&ei=UTF-8
- 11 http://b.hatena.ne.jp/hotentry?mode=daily&date=20080927
- 11 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4DBJP_jaJP267JP268&q=int
- 10 http://b.hatena.ne.jp/entry/http://blog.livedoor.jp/lalha/archives/50236522.html
- 10 http://b.hatena.ne.jp/entry/http://d.hatena.ne.jp/kazu-yamamoto/20080828/1219888005
- 9 http://www.masayashi.com/

