Haskellの文字列扱いを少し
|
import Codec.Binary.UTF8.String -- str = ["\x0041", "\x3042", "\x57CE", "\x2F852"] str = ["A", "あ", "城", "?"] main::IO() main = do putStrLn "Haskell内部コード" mapM_ print str mapM_ putStrLn str putStrLn "Haskell内部コード>UTF8コード" mapM_ (\x -> print $ encodeString x) str mapM_ (\x -> putStrLn $ decodeString $ encodeString x) str |
出力結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
$ ./strsmpl Haskell内部コード "A" "\12354" "\22478" "\194642" A あ 城 ? Haskell内部コード>UTF8コード "A" "\227\129\130" "\229\159\142" "\240\175\161\146" A あ 城 ? |
Haskell内部ではUnicodeスカラ値で扱われている。
printはどうやらBasic Latinしか文字を表示することができないようで、後は内部コードをそのまま表示している
putStr(Ln)については内部コードに応じたフォントを表示してくれる。
内部コードとUTF-8との変換はencodeString(内部コード >> UTF-8)とdecodeStringを使う。
フォント表示についてはLANG環境変数が影響する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
$ LANG=en_US.UTF-8 ./strsmpl Haskell内部コード "A" "\12354" "\22478" "\194642" A あ 城 ? Haskell内部コード>UTF8コード "A" "\227\129\130" "\229\159\142" "\240\175\161\146" A あ 城 ? |
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
|
$ LANG=ja_JP. ./strsmpl Haskellstrsmpl: <stdout>: commitBuffer: invalid argument (invalid character) $ LANG=ja_JP.eucJP ./strsmpl Haskellstrsmpl: </stdout><stdout>: commitBuffer: invalid argument (invalid character) $ LANG=ja_JP.ujis ./strsmpl Haskellstrsmpl: </stdout><stdout>: commitBuffer: invalid argument (invalid character) $ LANG=en_US ./strsmpl Haskellstrsmpl: </stdout><stdout>: commitBuffer: invalid argument (invalid character) $ LANG=en_US.UTF-8 ./strsmpl Haskell内部コード "A" "\12354" "\22478" "\194642" A あ 城 ? Haskell内部コード>UTF8コード "A" "\227\129\130" "\229\159\142" "\240\175\161\146" A あ 城 ? </stdout> |
UTF-8であることをLANGで設定していないと出力で例外となる