Unicode 带有非英语字符的Haskell IO
看看这个,我正在努力Unicode 带有非英语字符的Haskell IO,unicode,haskell,localization,io,locale,Unicode,Haskell,Localization,Io,Locale,看看这个,我正在努力 appendFile "out" $ show 'д' а是俄语字母表中的字符。 在该“输出”之后,文件包含: '\1076' 我是如何理解字符“П”的unicode数字代码的。为什么会这样?我怎样才能得到我角色的正常表现 有关其他信息,请参见: appendFile "out" "д" 谢谢 快速搜索“UTF Haskell”会给你提供很好的链接。可能最推荐的软件包是软件包 show转义ASCII范围以外的所有字符(以及ASCII范围内的一些字符),因此不要使用s
appendFile "out" $ show 'д'
а是俄语字母表中的字符。
在该“输出”之后,文件包含:
'\1076'
我是如何理解字符“П”的unicode数字代码的。为什么会这样?我怎样才能得到我角色的正常表现
有关其他信息,请参见:
appendFile "out" "д"
谢谢 快速搜索“UTF Haskell”会给你提供很好的链接。可能最推荐的软件包是软件包
show
转义ASCII范围以外的所有字符(以及ASCII范围内的一些字符),因此不要使用show
既然“П”很好用,就用它吧。如果你不能,因为Ф实际上在一个变量内,你可以使用
[c]
(其中c是包含字符的变量。如果你需要用单引号将其括起来(就像show一样),你可以使用['\'',c'\'']
使用Data.Text。它为IO提供了区域设置感知和编码支持。在阅读了您对我的评论的回复后,我认为您的情况是您有一些数据结构,可能是类型为[(String,String)]
,您希望出于调试目的输出它。使用show
会很方便,但它会转义非ASCII字符
这里的问题不在于unicode,您需要一个能够正确格式化数据以供显示的函数。我认为show
不是正确的选择,部分原因在于转义某些字符的问题。您需要的是一个类似show
的类型类,但它显示数据以供读取,而不是转义字符字符。也就是说,你需要一台漂亮的打印机,这是一个提供格式化数据以供显示的函数库。Hackage上有几台漂亮的打印机,我会看看,或者先看看。我认为这两种都适合,不需要做太多的工作
下面是一个uulib工具的示例。使用了Pretty
type类而不是Show,该库附带了许多有用的实例
import UU.PPrint
-- | Write each item to StdOut
logger :: Pretty a => a -> IO ()
logger x = putDoc $ pretty x <+> line
如果要输出到文件而不是控制台,可以使用hPutDoc
函数输出到句柄。也可以调用renderSimple
生成SimpleDoc
,然后在构造函数上进行模式匹配以处理输出,但这可能会更麻烦。无论您做什么,都要避免show
:
Prelude UU.PPrint> show $ pretty 'Д'
"\1044"
您也可以编写自己的类型类,类似于show,但格式随您的喜好而定。
Text.Printf
模块可能会对您有所帮助。要按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 ++ ['"']
初学者信息:请记住,该节目不显示任何内容。该节目将数据转换为带有附加格式字符的字符串
我们可以在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
我正在为谷歌添加标签“polskie znaki haskell”。Data.Text很棒,但内置IO系统也提供了区域设置感知和编码支持(自GHC 6.12以来)。我认为许多haskell程序员过度使用了
show
。它不适合漂亮的打印,因为它是用于序列化的(例如,read.show
应该等于id
),但对于大多数序列化应用程序来说,性能太差了。它对于测试和原型设计很方便,但除此之外,我会仔细考虑使用show
。我想使用show进行调试。“show”将“数据结构”转换为字符串。例如,我有[(string,string)]我很想看看。当然,这是最好的方式输出到控制台,但这是不可能的。因为我使用文件。我同意调试是show最常见的良好用途之一。对于像您这样的情况,它会变得很棘手,因为转义ASCII以外的字符(以及转义换行符,这对我来说特别烦人)。你能知道漂亮的打印机如何帮助我吗?我添加了一个例子,说明这一点。请注意,使用漂亮的打印机的通常方法是一次组装所有数据,并一次性呈现文档。我逐行这样做,因为这对调试更有用;你将在程序中获得更多的部分输出崩溃或挂起。代码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