haskell中是否存在一些预先构建的函数来将字符串转换为字节?如果没有,你能以优雅的方式为我提出一些方法吗?
例如:
foo "cz" = "\63\7a\00"
答案 0 :(得分:3)
String
只是[Char]
的同义词,Char
是Enum
的实例,因此有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
转换为各种字节编码:
当与Data.Text.pack :: String -> Text
和Data.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"