提问人:Fredrik Karlsson 提问时间:8/21/2014 更新时间:8/21/2014 访问量:482
Unicode 上的 parsec 输出 (UTF-8) 字符
Parsec output on unicode (UTF-8) char
问:
只需要了解与 Parsec 相关的东西。
parseTest (many1 alphaNum) "re2re1Δ"
"re2re1\916"
:t parseTest (many1 alphaNum)
parseTest (many1 alphaNum) :: Text.Parsec.Prim.Stream s Data.Functor.Identity.Identity Char =>
s -> IO ()
因此,Unicode的输出(应该是UTF-8,因为我在OSX上)被打印为十六进制(?)代码(应该是希腊语delta字符)。 现在,putChar 不会在同一个 ghci 会话(和同一个终端)中进行相同的转换
Text.Parsec.Char> putChar 'Δ'
Δ
怎么会这样?不知何故,它们都应该只是“Char”类型......?
答:
7赞
Sibi
8/21/2014
#1
这里的原因与方式有关,并且正在实施。show
putChar
λ> show "re2re1Δ"
"\"re2re1\\916\""
λ> mapM_ putChar "re2re1Δ"
re2re1Δ
从源代码中,您可以看到该实例的定义如下:Show
Char
instance Show Char where
showsPrec _ '\'' = showString "'\\''"
showsPrec _ c = showChar '\'' . showLitChar c . showChar '\''
showList cs = showChar '"' . showl cs
where showl "" s = showChar '"' s
showl ('"':xs) s = showString "\\\"" (showl xs s)
showl (x:xs) s = showLitChar x (showl xs s)
putChar
是这样实现的:
putChar :: Char -> IO ()
putChar c = hPutChar stdout c
该函数在内部使用函数,而函数本身在内部使用,这就是获取增量的 Unicode 代码点值的原因。parseTest
print
show
评论