繁体   English   中英

Haskell IO,非英文字符

[英]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上有几款漂亮的打印机,我会先看看uulibwl-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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM