如何在Haskell中将Unicode转义序列转换为Unicode字符串

时间:2014-07-25 10:03:36

标签: haskell

我有一个像"\3619\3657\3634\3609\3648\3592\3657\3648\3621\3657\3591"这样的字符串,我想解码它。我试着搜索unicode库但没有成功。

1 个答案:

答案 0 :(得分:9)

  

前奏> putStrLn“\ 3619 \ 3657 \ 3634 \ 3609 \ 3648 \ 3592 \ 3657 \ 3648 \ 3621 \ 3657 \ 3591”

  ร้านเจ้เล้ง

请注意,您实际上没有字符串"\3619\3657\3634\3609\3648\3592\3657\3648\3621\3657\3591" - 而是拥有UTF-32字符串ร้านเจ้เล้ง"\3619\3657..."恰好是符合ASCII的字符。默认情况下,GHCi使用Show实例来显示结果,这并没有显示出吐出可用作事物的Haskell代码的文字。它在unicode方面很保守。这就是为什么

  

前奏> “ร้านเจ้เล้ง”
  “\ 3619 \ 3657 \ 3634 \ 3609 \ 3648 \ 3592 \ 3657 \ 3648 \ 3621 \ 3657 \ 3591”

另一方面,putStrLnputCharhPutStr等函数只会将字符串本身转储为UTF-8而不是ASCII安全表示。

如果您实际上正在从文件或其他内容中读取转义字符串,则只需读取即可:

  

前奏> s< - getLine
  “\ 3619 \ 3657 \ 3634 \ 3609 \ 3648 \ 3592 \ 3657 \ 3648 \ 3621 \ 3657 \ 3591”
  前奏>小号
  “\”\ 3619 \\ 3657 \\ 3634 \\ 3609 \\ 3648 \\ 3592 \\ 3657 \\ 3648 \\ 3621 \\ 3657 \\ 3591 \“”
- 请注意双转义,因为我正在显示一个包含字符串文字的字符串。
  前奏> putStrLn $ read s
  ร้านเจ้เล้ง