HaskellでStringをByteStringに変換する最良の方法は何ですか?
問題に対する私の腸の反応は
import qualified Data.ByteString as B
import Data.Char (ord)
packStr = B.pack . map (fromIntegral . ord)
しかし、これは満足のいくものではないようです。
HaskellでStringをByteStringに変換する最良の方法は何ですか?
問題に対する私の腸の反応は
import qualified Data.ByteString as B
import Data.Char (ord)
packStr = B.pack . map (fromIntegral . ord)
しかし、これは満足のいくものではないようです。
これは、目的のエンコーディングが UTF-8 であると仮定した Haskell String/Text/ByteString strict/lazy 変換のチート シートです。Data.Text.Encoding ライブラリには、利用可能な他のエンコーディングがあります。
(OverloadedStrings を使用して) 書き込まないようにしてください。
lazyByteString :: BL.ByteString
lazyByteString = "lazyByteString ä ß" -- BAD!
これは予期しない方法でエンコードされます。試す
lazyByteString = BLU.fromString "lazyByteString ä ß" -- good
代わりは。
タイプ 'Text' の文字列リテラルは、エンコーディングに関しては正常に機能します。
カンニングペーパー:
import Data.ByteString.Lazy as BL
import Data.ByteString as BS
import Data.Text as TS
import Data.Text.Lazy as TL
import Data.ByteString.Lazy.UTF8 as BLU -- from utf8-string
import Data.ByteString.UTF8 as BSU -- from utf8-string
import Data.Text.Encoding as TSE
import Data.Text.Lazy.Encoding as TLE
-- String <-> ByteString
BLU.toString :: BL.ByteString -> String
BLU.fromString :: String -> BL.ByteString
BSU.toString :: BS.ByteString -> String
BSU.fromString :: String -> BS.ByteString
-- String <-> Text
TL.unpack :: TL.Text -> String
TL.pack :: String -> TL.Text
TS.unpack :: TS.Text -> String
TS.pack :: String -> TS.Text
-- ByteString <-> Text
TLE.encodeUtf8 :: TL.Text -> BL.ByteString
TLE.decodeUtf8 :: BL.ByteString -> TL.Text
TSE.encodeUtf8 :: TS.Text -> BS.ByteString
TSE.decodeUtf8 :: BS.ByteString -> TS.Text
-- Lazy <-> Strict
BL.fromStrict :: BS.ByteString -> BL.ByteString
BL.toStrict :: BL.ByteString -> BS.ByteString
TL.fromStrict :: TS.Text -> TL.Text
TL.toStrict :: TL.Text -> TS.Text
彼はエンコーディングを正しく扱っているので、Peaker の回答を +1 してください。
Data.ByteString.UTF8.fromStringも便利です。バージョンはChar8ユニコード性を失い、UTF8はUTF8でエンコードされたものになりByteStringます。どちらかを選択する必要があります。