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

25 unicode io haskell ghc bytestring

我试图简单地将UTF-8编码的数据输出到控制台.

我已经设法完成了这个String,但现在我想做同样的事情ByteString.有一个很好的快速方法吗?

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

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

main :: IO ()
main = putStr $ pack "?ušpajž???"
Run Code Online (Sandbox Code Playgroud)

打印出来uapaj~?,?,呃.

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

谢谢!

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

Wei*_* Hu 26

utf8-string 支持字节串.

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

main :: IO ()
main = putStr $ fromString "?ušpajž???"
Run Code Online (Sandbox Code Playgroud)


Don*_*art 21

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


但是,从2011年开始,您应该使用该text软件包,以获得快速,打包的unicode输出.GHC截断Unicode字符输出

你的例子变得简单得多:

{-# LANGUAGE OverloadedStrings #-}

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

main = T.putStrLn "?ušpajž???"
Run Code Online (Sandbox Code Playgroud)

像这样:

$ runhaskell A.hs
?ušpajž???
Run Code Online (Sandbox Code Playgroud)

  • 不,它也适用于字节串.请参见http://stackoverflow.com/questions/2086842/using-haskell-to-output-a-utf-8-encoded-bytestring/2089195#2089195 (3认同)