[英]Haskell IO with non English characters
看看这个,我试试
appendFile "out" $ show 'д'
'д'是俄语字母的字符。 之后“out”文件包含:
'\1076'
我的理解是字符'д'的unicode数字代码。 为什么会这样? 我怎样才能得到我角色的正常表现?
有关其他信息,它是有效的:
appendFile "out" "д"
谢谢。
show
转义ASCII范围之外的所有字符(以及ASCII范围内的一些字符),因此不要使用show
。
由于“д”工作正常,只需使用它。 如果你不能因为д实际上在变量中,你可以使用[c]
(其中c是包含该字符的变量。如果你需要用单引号括起来(比如show do),你可以使用['\\'', c, '\\'']
。
在阅读了我对我的评论的回复之后,我认为你的情况是你有一些数据结构,可能是[(String,String)]
,并且你想输出它用于调试目的。 使用show
将是convienent,但它会转义非ASCII字符。
这里的问题不在于unicode,你需要一个能够正确格式化数据以便显示的函数。 我不认为show
是正确的选择,部分原因是因为逃避一些角色的问题。 你需要的是一个像Show
这样的类型类,但是它显示了用于读取而不是转义字符的数据。 也就是说,你需要一台漂亮的打印机,它是一个提供格式化数据显示功能的库。 Hackage上有几款漂亮的打印机,我会先看看uulib或wl-pprint 。 我认为要么没有太多工作就适合。
这是uulib工具的一个例子。 使用Pretty
类来代替Show,该库带有许多有用的实例。
import UU.PPrint
-- | Write each item to StdOut
logger :: Pretty a => a -> IO ()
logger x = putDoc $ pretty x <+> line
在ghci中运行:
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"
你也可以编写自己的类型类似于show,但格式化你喜欢它。 如果你走这条路线, Text.Printf
模块会很有帮助。
使用Data.Text。 它为IO提供了语言环境感知和编码支持。
快速搜索“UTF Haskell”应该可以为您提供良好的链接。 可能最推荐的包是文本包。
import Data.Text.IO as UTF
import Data.Text as T
main = UTF.appendFile "out" (T.pack "д")
要通过show显示国家字符,请输入您的代码:
{-# 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
我正在为Google添加标签“polskie znaki haskell”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.