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

Ath*_*han 3 haskell

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

lef*_*out 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"

在另一方面,putStrLn,putChar,hPutStr等功能将只转储在UTF-8,而不是其ASCII安全表示字符串本身.

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

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

  • 一个细节 - 他们尝试使用locale设置的编码来转储字符串,而不是始终使用UTF-8.如果你使用的是未设置为UTF-8的语言环境,那你就疯了.:) (2认同)