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

Unicode 使用Haskell输出UTF-8编码的ByteString,unicode,haskell,io,ghc,bytestring,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~�,�,啊 我想知道最新

我要发疯了,试图简单地将UTF-8编码的数据输出到控制台

我已经使用
String
实现了这一点,但现在我想用
ByteString
实现这一点。有没有一个又好又快的方法

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

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

main :: IO ()
main = putStr $ pack "čušpajž日本語"
它打印出
uapaj~�,�,啊

我想知道最新的GHC6.12.1 best的答案,不过我也想听听以前版本的答案

谢谢


更新:简单地读取和输出同一行UTF-8编码的文本似乎可以正常工作。(使用
Data.ByteString.Char8
,我只需执行
putStr=
ByteString
是字节字符串。当它们被输出时,它们将被截断为8位,正如
Data.ByteString.Char8
文档中所述。您需要通过
utf8 string
包将它们显式转换为utf8n Hackage,它包含对bytestring的支持

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

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

但是,从2011年起,您应该使用
文本
包来实现快速、压缩的unicode输出

您的示例变得简单得多:

{-# 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ž日本語

utf8字符串
支持bytestrings

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

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

您使用的是什么平台?Unicode在类UNIX平台上运行得很好;Windows支持有点滞后。请参阅System.IO的文档:“(GHC注意:在Windows上,我们目前不支持双字节编码;如果控制台的代码页不受支持,则localeEncoding将为拉丁1。)”64位Linux。不
System.IO
仅与
String
一起工作吗?您不应该使用
BS.Char8
,因为它采用8位编码并截断多字节Unicode字符。除非您完全知道
BS.Char8
是正确的数据类型,否则请使用普通的bytestring(这包括了解为什么普通bytestring显式不是该用例的正确类型)(但是,我很困惑……它似乎可以很好地处理常规字符串?不管这是什么,它现在已经被修复了。执行链接页面上给出的示例可以如期工作。区别在于我试图输出UTF-8编码的ByteStrings,而不是UTF-8编码的字符串,这应该更有效。请记住,我目前使用的是GHC 6.12.1,虽然我知道这个问题在GHC 6.10.4中也不存在。不,这不是真正的问题。如果语言环境设置为utf8字符串IO,GHC 6.12会执行utf8字符串IO。这实际上解决了上面的错误,而这不是OP要问的问题。utf8字符串不是只处理字符串,而是处理ByTestRing吗?不,它也处理ByTestRing。see