首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Data.ByteString与Data.ByteString.Char8的区别

Data.ByteString与Data.ByteString.Char8的区别
EN

Stack Overflow用户
提问于 2017-11-23 02:19:12
回答 1查看 985关注 0票数 6

我看到Char8只支持ASCII字符,如果您使用其他Unicode字符,使用它将是危险的。

代码语言:javascript
复制
{-# 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"

产生的结果与

代码语言:javascript
复制
{-# 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.Char8Data.ByteString有什么区别呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-23 02:42:54

如果您比较Data.ByteStringData.ByteString.Char8,您会注意到在前者中引用Word8的一组函数在后者中引用了Char

代码语言:javascript
复制
-- 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 在两个模块中都做了完全相同的事情。

下面是查看TextByteStringByteString.Char8中类似函数的不同行为的好方法

代码语言:javascript
复制
{-# 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 character
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47446588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档