Ecco il mio cheat sheet per Haskell String/Text/ByteString conversione rigorosa/lenta assumendo che la codifica desiderata sia UTF-8. La libreria Data.Text.Encoding ha altre codifiche disponibili.
Assicurati di non scrittura (utilizzando OverloadedStrings):
lazyByteString :: BL.ByteString
lazyByteString = "lazyByteString ä ß" -- BAD!
Questo otterrà codificato in modo inaspettato. Prova
lazyByteString = BLU.fromString "lazyByteString ä ß" -- good
invece.
Le stringhe di tipo "Testo" funzionano bene per quanto riguarda la codifica.
Cheat Sheet:
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
prega +1 risposta di Peaker, perché si occupa in modo corretto con la codifica.
Moderno: è necessario convertire in genere '[Char]' in 'Text' e' [Word8] 'in' ByteString'. È ancora 'pack' però :) – alternative
Convertire Unicode in byte comporta l'uso di una codifica Unicode. L'uso di 'pack' è più simile a un cast non sicuro. – tibbe