看这里,我正在尝试
appendFile "out" $ show 'д'
“д”是俄语字母表中的一个字母。之后,“out”文件包含:
'\1076'
我理解的是字符“д”的Unicode数值代码。为什么会出现这种情况?我该如何得到我的字符的正常表示方式?
附加信息:它能够良好地工作。
appendFile "out" "д"
谢谢。
看这里,我正在尝试
appendFile "out" $ show 'д'
'\1076'
appendFile "out" "д"
show
会转义ASCII范围外(和一些ASCII范围内)的所有字符,所以不要使用show
。
由于"д"可以正常工作,因此只需使用它。如果您不能使用它,因为д实际上在变量内部,您可以使用[c]
(其中c是包含字符的变量)。如果您需要用单引号(就像show一样)将其括起来,则可以使用['\'', c, '\'']
。
[(String,String)]
,并且您想要将其输出以进行调试。使用show
会很方便,但它会转义非ASCII字符。show
不是正确的选择,部分原因是因为转义某些字符的问题。你需要一个类似于Show
的类型类,但它显示数据用于阅读而不是转义字符。也就是说,你需要一个漂亮的打印机,它是一个库,提供了函数来格式化数据以供显示。Hackage上有几个漂亮的打印机可供选择,我建议看看uulib或wl-pprint。我认为任何一个都可以适用,而且不需要太多的工作。Pretty
类型类代替Show,该库带有许多有用的实例。import UU.PPrint
-- | Write each item to StdOut
logger :: Pretty a => a -> IO ()
logger x = putDoc $ pretty x <+> line
Prelude UU.PPrint> logger 'Д'
Д
Prelude UU.PPrint> logger ('Д', "other text", 54)
(Д,other text,54)
Prelude UU.PPrint>
hPutDoc
函数将其输出到句柄。你也可以调用 renderSimple
生成一个 SimpleDoc
,然后在构造函数上进行模式匹配以处理输出,但这可能会更麻烦。无论你做什么,都要避免使用 show
。Prelude UU.PPrint> show $ pretty 'Д'
"\1044"
Text.Printf
模块可能会有所帮助。要显示国际字符,请在你的程序代码中添加:
{-# LANGUAGE FlexibleInstances #-}
instance {-# OVERLAPPING #-} Show String where
show = id
你可以尝试一下:
*Main> show "ł"
ł
*Main> show "ą"
ą
*Main> show "ę"
ę
*Main> show ['ę']
ę
*Main> show ["chleb", "masło"]
[chleb,masło]
*Main> data T = T String deriving (Show)
*Main> t = T "Chleb z masłem"
*Main> t
T Chleb z masłem
*Main> show t
T Chleb z masłem
在我的先前解决方案中没有引号。此外,我现在将代码放入了模块中,该模块必须被导入到您的程序中。
{-# LANGUAGE FlexibleInstances #-}
module M where
instance {-# OVERLAPPING #-} Show String where
show x = ['"'] ++ x ++ ['"']
初学者须知:记住,show 命令不会显示任何内容。它将数据转换为字符串,并添加格式化字符。
我们可以在 WinGHCi 中尝试: 通过 WinGHCi 自动执行
*M> "ł"
"ł"
*M> "ą"
"ą"
*M> "ę"
"ę"
*M> ['ę']
"ę"
*M> ["chleb", "masło"]
["chleb","masło"]
*M> data T = T String deriving (Show)
*M> t = T "Chleb z masłem"
或者手动
*M> (putStrLn . show) "ł"
"ł"
*M> (putStrLn . show) "ą"
"ą"
*M> (putStrLn . show) "ę"
"ę"
*M> (putStrLn . show) ['ę']
"ę"
*M> (putStrLn . show) ["chleb", "masło"]
["chleb","masło"]
*M> data T = T String deriving (Show)
*M> t = T "Chleb z masłem"
*M> (putStrLn . show) t
T "Chleb z masłem"
在代码中显示:
putStrLn "ł"
putStrLn "ą"
putStrLn "ę"
putStrLn "masło"
(putStrLn . show) ['ę']
(putStrLn . show) ["chleb", "masło"]
data T = T String deriving (Show)
t = T "Chleb z masłem"
(putStrLn . show) t
import Data.Text.IO as UTF
import Data.Text as T
main = UTF.appendFile "out" (T.pack "д")
show
,我认为这不适合用于漂亮的打印输出,因为它是用于序列化的(例如read . show
应该等同于id
),但大多数序列化应用程序的性能太差。它对于测试和原型设计很方便,但除此之外,我会三思而后再使用show
。 - John L