unicode – 具有非英文字符的Haskell IO

看看这个,我试试

appendFile "out" $show 'д'

‘д’是俄语字母的字符.
之后“out”文件包含:

'\1076'

我的理解是字符’д’的unicode数字代码.为什么会这样?我怎样才能得到我角色的正常表现?

有关其他信息,它是有效的:

appendFile "out"  "д"

谢谢.

在阅读了我对我的评论的回复之后,我认为你的情况是你有一些数据结构,可能是[[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,然后在构造函数上进行模式匹配以处理输出,但这可能会更麻烦.无论你做什么,避免显示:

Prelude UU.PPrint> show $pretty 'Д'
"\1044"

你也可以编写自己的类型类似于show,但格式化你喜欢它.如果你走这条路线,Text.Printf模块会很有帮助.

相关文章
相关标签/搜索