Aquí está mi hoja de trucos para Haskell String/Text/ByteString strict/perezosa conversión suponiendo que la codificación deseada es UTF-8. La biblioteca Data.Text.Encoding tiene otras codificaciones disponibles.
Por favor asegúrese de que no escritura (usando OverloadedStrings):
lazyByteString :: BL.ByteString
lazyByteString = "lazyByteString ä ß" -- BAD!
Esto hará que codificado de una manera inesperada. Pruebe
lazyByteString = BLU.fromString "lazyByteString ä ß" -- good
en su lugar.
Los literales de cadena del tipo 'Texto' funcionan bien con respecto a la codificación.
hoja de trucos:
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
import Data.ByteString.UTF8 as BSU
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
favor, 1 respuesta de Peaker, porque él correctamente se ocupa de codificación.
Moderno: Normalmente debe convertir '[Char]' a 'Text' y' [Word8] 'a' ByteString'. Sin embargo, su 'paquete' :) – alternative
La conversión de Unicode a bytes implica el uso de una codificación Unicode. Usar 'pack' es más similar a un lanzamiento inseguro. – tibbe