Last active
October 11, 2017 00:32
-
-
Save tomoyat1/1da017384700b9468d036a0c61202300 to your computer and use it in GitHub Desktop.
HaskellにおけるUTF-8・Unicodeの表示
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{-# 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