将字符串转换为字节

时间:2016-12-29 18:42:31

标签: haskell

haskell中是否存在一些预先构建的函数来将字符串转换为字节?如果没有,你能以优雅的方式为我提出一些方法吗? 例如:
foo "cz" = "\63\7a\00"

1 个答案:

答案 0 :(得分:3)

haskell中的

String只是[Char]的同义词,CharEnum的实例,因此有fromEnum :: Char -> Int,它会将单个Char转换为相应的unicode代码点的索引:

λ let toUnicodeCodepoints = map fromEnum
λ toUnicodeCodepoints "\0\1\2abc\955λ\9731☃"
[0,1,2,97,98,99,955,955,9731,9731]

如果你想要字节,那么它就是一个编码问题。你想要字符串的ASCII编码的字节?拉丁语1? UTF-8? UTF-16小端? (依此类推)

Data.Text.Encoding有一些工具可以将Text转换为各种字节编码:

  • encodeUtf16BE
  • encodeUtf32BE
  • encodeUtf8
  • encodeUtf16LE
  • encodeUtf32LE

当与Data.Text.pack :: String -> TextData.ByteString.unpack :: ByteString -> [Word8]结合使用时,可以为您提供给定编码的字节列表:

λ let toUTF8Bytes = Data.ByteString.unpack . encodeUtf8 . Data.Text.pack
λ toUTF8Bytes "\0\1\2abc\955λ\9731☃"
[0,1,2,97,98,99,206,187,206,187,226,152,131,226,152,131]

UPDATE :根据注释,如果要将字符串中的所有字符转义为其十六进制转义表示,可以使用Numeric.showHex来获取十六进制字符串:

λ let escapeAsHex = showString "\"" . foldr ((showString "\\x" .) . Numeric.showHex . fromEnum) "\""
λ escapeAsHex "\0\1\2abc\955λ\9731☃"
"\"\\x0\\x1\\x2\\x61\\x62\\x63\\x3bb\\x3bb\\x2603\\x2603\""
λ putStrLn $ escapeAsHex "\0\1\2abc\955λ\9731☃"
"\x0\x1\x2\x61\x62\x63\x3bb\x3bb\x2603\x2603"
λ read $ escapeAsHex "\0\1\2abc\955λ\9731☃" :: String
"\NUL\SOH\STXabc\955\955\9731\9731"