Вот мой обманщик для строки Haskell String/Text/ByteString с строгим/ленивым преобразованием, предполагая, что желаемой кодировкой является UTF-8. Библиотека Data.Text.Encoding имеет другие кодировки.
Пожалуйста, убедитесь, что не записи (с использованием OverloadedStrings):
lazyByteString :: BL.ByteString
lazyByteString = "lazyByteString ä ß" -- BAD!
Это будет получить закодированную неожиданным образом. Попробуйте
lazyByteString = BLU.fromString "lazyByteString ä ß" -- good
вместо этого.
Строковые литералы типа «Текст» отлично работают с кодировкой.
Шпаргалка:
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
Пожалуйста +1 ответа акустического, потому что он правильно занимается кодированием.
Modern: Обычно вы должны преобразовывать '[Char]' в 'Text' и' [Word8] 'в' ByteString'. Его все еще 'pack' хотя :) – alternative
Преобразование Unicode в байты включает использование кодировки Unicode. Использование 'pack' больше похоже на небезопасный листинг. – tibbe