Skip to content

Instantly share code, notes, and snippets.

@tomoyat1
Last active October 11, 2017 00:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tomoyat1/1da017384700b9468d036a0c61202300 to your computer and use it in GitHub Desktop.
Save tomoyat1/1da017384700b9468d036a0c61202300 to your computer and use it in GitHub Desktop.
HaskellにおけるUTF-8・Unicodeの表示
{-# LANGUAGE OverloadedStrings #-}
import qualified Data.ByteString as BS
import qualified Data.Text as T
import qualified Data.Text.Encoding as T
import System.IO
foo :: T.Text
foo = "日本語"
main :: IO ()
main = do
print foo
-- "\26085\26412\35486"
putStrLn $ T.unpack foo
-- 日本語
-- 同じUnicodeコードポイント列であるTextとStringでも,Stringの場合はputStrLnをしたときにGHCが
-- 勝手に「文字」に戻してくれるのに対して,Textのままだとその支援が受けられない.
putStrLn "\26085\26412\35486"
-- 日本語
-- 文字列リテラルがUnicodeのコードポイント列で,更にその型がStringのとき,GHCが「文字」として出力してくれる.
-- Unicodeが勝手にターミナルの文字コードで符号化され,その符号化されたバイト列が標準出力に吐き出されているのがポイント.
hGetEncoding stdout
-- Just UTF-8
BS.hPut stdout $ T.encodeUtf8 $ T.append foo "\n"
-- 日本語
-- Textに含まれるコードポイント列は,<ターミナルの文字列>に自分の手で符号化し,Handleを使ってstdoutに書き出すとちゃんと表示される.
-- なお,ここでのターミナルの文字列はUTF-8とする
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment