我看到Char8只支持ASCII字符,如果您使用其他Unicode字符,使用它将是危险的。
{-# LANGUAGE OverloadedStrings #-}
--import qualified Data.ByteString as B
import qualified Data.ByteString.Char8 as BC
import qualified Data.Text.IO as TIO
import qualified Data.Text.Encoding as E
import qualified Data.Text as T
name :: T.Text
name = "{ \"name\": \"哈时刻\" }"
nameB :: BC.ByteString
nameB = E.encodeUtf8 name
main :: IO ()
main = do
BC.writeFile "test.json" nameB
putStrLn "done"产生的结果与
{-# LANGUAGE OverloadedStrings #-}
import qualified Data.ByteString as B
--import qualified Data.ByteString.Char8 as BC
import qualified Data.Text.IO as TIO
import qualified Data.Text.Encoding as E
import qualified Data.Text as T
name :: T.Text
name = "{ \"name\": \"哈时刻\" }"
nameB :: B.ByteString
nameB = E.encodeUtf8 name
main :: IO ()
main = do
B.writeFile "test.json" nameB
putStrLn "done"那么使用Data.ByteString.Char8和Data.ByteString有什么区别呢?
发布于 2017-11-23 02:42:54
如果您比较Data.ByteString和Data.ByteString.Char8,您会注意到在前者中引用Word8的一组函数在后者中引用了Char。
-- Data.ByteString
map :: (Word8 -> Word8) -> ByteString -> ByteString
cons :: Word8 -> ByteString -> ByteString
snoc :: ByteString -> Word8 -> ByteString
head :: ByteString -> Word8
uncons :: ByteString -> Maybe (Word8, ByteString)
{- and so on... -}
-- Data.ByteString.Char8
map :: (Char -> Char) -> ByteString -> ByteString
cons :: Char -> ByteString -> ByteString
snoc :: ByteString -> Char -> ByteString
head :: ByteString -> Char
uncons :: ByteString -> Maybe (Char, ByteString)
{- and so on... -}对于这些函数,以及仅针对这些函数,Data.ByteString.Char8提供了不必不断地将Word8值转换为Char值和从Char值中转换出来的方便。writeFile 在两个模块中都做了完全相同的事情。
下面是查看Text、ByteString和ByteString.Char8中类似函数的不同行为的好方法
{-# LANGUAGE OverloadedStrings #-}
import Data.Text.Encoding
import qualified Data.Text as T
import qualified Data.ByteString as B
import qualified Data.ByteString.Char8 as BC
nameText :: T.Text
nameText = "哈时刻"
nameByteString :: B.ByteString
nameByteString = encodeUtf8 nameText
main :: IO ()
main = do
print $ T.head nameText -- '\21704' actual first character
print $ B.head nameByteString -- 229 first byte
print $ BC.head nameByteString -- '\299' first byte as character
putStrLn [ T.head nameText ] -- 哈 actual first character
putStrLn [ BC.head nameByteString ] -- å first byte as characterhttps://stackoverflow.com/questions/47446588
复制相似问题