Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unicode 带有非英语字符的Haskell IO_Unicode_Haskell_Localization_Io_Locale - Fatal编程技术网

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