Unicode 上的 parsec 输出 (UTF-8) 字符

Parsec output on unicode (UTF-8) char

提问人:Fredrik Karlsson 提问时间:8/21/2014 更新时间:8/21/2014 访问量:482

问:

只需要了解与 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”类型......?

Haskell Unicode UTF-8 字符 解析

评论


答:

7赞 Sibi 8/21/2014 #1

这里的原因与方式有关,并且正在实施。showputChar

λ> show "re2re1Δ"
"\"re2re1\\916\""
λ> mapM_ putChar "re2re1Δ"
re2re1Δ

从源代码中,您可以看到该实例的定义如下:ShowChar

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 代码点值的原因。parseTestprintshow