将文本转换为Unicode转义序列

时间:2016-08-30 17:40:25

标签: haskell unicode character-encoding

我有一个Text对象,其中包含一些需要转换为格式为\u#####为十六进制数字的unicode转义序列的拉丁字符

如上所述here,haskell很容易将字符串转换为转义序列,反之亦然。但是,它只会转到十进制表示。例如,

> let s = "Ñ"
> s
"\209"

有没有办法指定转义序列编码以强制它以正确的格式吐出?即

> let s = encodeUnicode16 "Ñ"
> s
"\u00d1"

1 个答案:

答案 0 :(得分:3)

这个怎么样:

import Text.Printf (printf)

encodeUnicode16 :: String -> String
encodeUnicode16 = concatMap escapeChar
  where
    escapeChar c
        | ' ' <= c && c <= 'z' = [c]
        | otherwise =
            printf "\\u%04x" (fromEnum c)

我ghci,您可以按如下方式使用它:

> putStrLn $ encodeUnicode16 "Ñ"
\u00d1

请注意,如果您不使用putStrLn,它将被转义两次:

> encodeUnicode16 "Ñ"
"\\u00d1"

这是因为ghci会在命令前隐式添加print

修改:我错过了那个你有Text而不是String的部分。这是Text的相同代码:

import Data.Text (Text)
import qualified Data.Text as T
import qualified Data.Text.IO as T
import Text.Printf (printf)

encodeUnicode16 :: Text -> Text
encodeUnicode16 = T.concatMap escapeChar
  where
    escapeChar c
        | ' ' <= c && c <= 'z' = T.singleton c
        | otherwise =
            T.pack $ printf "\\u%04x" (fromEnum c)

同样,您希望使用T.putStrLn来避免双重转义。