簡體   English   中英

在[Char]和[Word8]之間進行轉換的最佳方式是什么?

[英]Best way to convert between [Char] and [Word8]?

我是Haskell的新手,我正在嘗試在我的app( Data.Digest.Pure.SHA )中使用帶有JSON庫( AttoJSON )的純SHA1實現。

AttoJSON使用Data.ByteString.Char8 ,SHA使用Data.ByteString.Lazy ,我的應用程序中的一些字符串文字是[Char]

Haskell Prime關於Char類型的維基頁面似乎表明這仍然是在Haskell語言/ Prelude中得到解決的問題。

這篇關於unicode支持的博客文章列出了一些圖書館,但它已有幾年了。

目前在這些類型之間進行轉換的最佳方法是什么,以及有哪些權衡?

謝謝!

對於Char8和Word8之間的轉換,您應該能夠使用toEnum / fromEnum轉換,因為它們代表相同的數據。

對於Char和Strings,您可以使用Data.ByteString.Char8.pack / unpack或某種map,toEnum和fromEnum的組合,但如果您使用的是ASCII以外的任何內容,則會拋出數據。

對於可能包含多於ASCII的字符串,一種流行的選擇是UTF8編碼。 我喜歡這個utf8-string包:

http://hackage.haskell.org/packages/archive/utf8-string/0.3.6/doc/html/Codec-Binary-UTF8-String.html

這就是我所擁有的,而不使用ByteString的內部函數。

import Data.ByteString as S (ByteString, unpack)
import Data.ByteString.Char8 as C8 (pack)
import Data.Char (chr)

strToBS :: String -> S.ByteString
strToBS = C8.pack

bsToStr :: S.ByteString -> String
bsToStr = map (chr . fromEnum) . S.unpack

S.unpack上的S.unpack給我們[Word8],我們應用(chr . fromEnum)將任何枚舉類型轉換為字符。 通過將所有這些組合在一起,我們將獲得我們想要的功能!

Char8和普通的字節串是一樣的,只是根據你導入的模塊使用不同的接口。 主要是你想在嚴格和懶惰的字節toChunks之間進行轉換,你使用toChunksfromChunks

要將字符放入字節串,請使用pack

另請注意,如果您的字符包含UTF-8中多字節表示的代碼點,則會出現問題。

注意:這在一個非常具體的情況下回答問題(在硬編碼字符串上調用函數)。

這似乎是一個小問題,因為轉換函數的存在如前面的答案中詳述。 但是我想要一種減少管理代碼的方法,即你必須編寫的代碼才能使函數協同工作。

減少字符串的類型處理代碼的解決方案是使用OverloadedStrings編譯指示並導入相關模塊

{-# LANGUAGE OverloadedStrings #-}
module Dummy where
import  Data.ByteString.Lazy.Char8 (ByteString, append)

bslHandling :: ByteString -> ByteString
bslHandling = (append myWord8List)

myWord8List = "I look like a String, but I'm actually a ByteString" 

注意:myWordList類型由編譯器推斷。

  • 如果你不在bslHandling中使用它,那么上面的聲明將會產生一個經典的[Char]類型。

  • 它沒有解決從一種特定類型傳遞到另一種特定類型的問題

希望能幫助到你

也許你想這樣做:

import Data.ByteString.Internal (unpackBytes)
import Data.ByteString.Char8 (pack)
import GHC.Word (Word8)

strToWord8s :: String -> [Word8]
strToWord8s = unpackBytes . pack 

假設Char和Word8是相同的,

import Data.Word ( Word8 ) 
import Unsafe.Coerce ( unsafeCoerce ) 

toWord8 :: Char -> Word8
toWord8 = unsafeCoerce

strToWord8 :: String -> Word8
strToWord8 = map toWord8

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM