使用Haskell输出UTF-8编码的ByteString

时间:2010-01-18 14:57:47

标签: unicode haskell io ghc bytestring

我想要简单地将UTF-8编码的数据输出到控制台。

我已成功使用String完成此操作,但现在我想对ByteString执行相同的操作。有一个很好的快速方法吗?

这是我到目前为止所做的,而且它不起作用:

import Prelude hiding (putStr)
import Data.ByteString.Char8 (putStr, pack)

main :: IO ()
main = putStr $ pack "čušpajž日本語"

打印出uapaj~�,�,呃。

我想获得最新GHC 6.12.1的答案,尽管我也希望听到以前版本的答案。

谢谢!

更新:简单地读取和输出相同的UTF-8编码的文本行似乎正常工作。 (使用Data.ByteString.Char8,我只做一个putStr =<< getLine。)但是.hs文件中的打包值,如上例所示,拒绝正确输出...我一定做错了什么? / p>

3 个答案:

答案 0 :(得分:26)

utf8-string支持bytestrings。

import Prelude hiding (putStr)
import Data.ByteString.Char8 (putStr)
import Data.ByteString.UTF8 (fromString)

main :: IO ()
main = putStr $ fromString "čušpajž日本語"

答案 1 :(得分:21)

bytestrings是字节串。当它们输出时,它们将被截断为8位,如Data.ByteString.Char8的文档中所述。你需要显式地将它们转换为utf8 - 通过Hackage上的utf8-string包,它包含对字节串的支持。


但是,从2011年开始,您应该使用text包,以获得快速,打包的unicode输出。 GHC truncating Unicode character output

你的例子变得简单得多:

{-# LANGUAGE OverloadedStrings #-}

import qualified Data.Text    as T
import qualified Data.Text.IO as T

main = T.putStrLn "čušpajž日本語"

像这样:

$ runhaskell A.hs
čušpajž日本語

答案 2 :(得分:-2)