Haskell IO,非英文字符

时间:2010-08-31 17:38:47

标签: unicode haskell localization io locale

看看这个,我试试

appendFile "out" $ show 'д'

'д'是俄语字母的字符。 之后“out”文件包含:

'\1076'

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

有关其他信息,它的效果很好:

appendFile "out"  "д"

感谢。

6 个答案:

答案 0 :(得分:4)

show转义ASCII范围之外的所有字符(以及ASCII范围内的所有字符),因此请勿使用show

由于“д”工作正常,只需使用它即可。如果你不能,因为д实际上在变量中,你可以使用[c](其中c是包含该字符的变量。如果你需要用单引号括起来(比如show do),你可以使用['\'', c, '\'']

答案 1 :(得分:3)

在阅读了我对我的评论的回复后,我认为你的情况是你有一些数据结构,可能是类型[(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模块可能会有所帮助。

答案 2 :(得分:2)

使用Data.Text。它为IO提供了语言环境感知和编码支持。

答案 3 :(得分:0)

快速搜索“UTF Haskell”应该会给你很好的链接。可能最推荐的包是text包。

import Data.Text.IO as UTF
import Data.Text as T

main = UTF.appendFile "out"  (T.pack "д")

答案 4 :(得分:0)

要通过show显示国家字符,请输入您的代码:

rails

您可以尝试:

{-# LANGUAGE FlexibleInstances #-}

instance {-# OVERLAPPING #-} Show String where
    show = id

答案 5 :(得分:0)

我之前的解决方案中没有引号。另外,我现在将代码放在模块中,并且必须将模块导入到程序中。

{-# 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"

或manualy

*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

我正在添加标签&#34; polskie znaki haskell&#34;对于谷歌。