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
haskell:从控制台读入特殊字符_Haskell_Unicode - Fatal编程技术网

haskell:从控制台读入特殊字符

haskell:从控制台读入特殊字符,haskell,unicode,Haskell,Unicode,我想从控制台读取包含特殊字符的字符串,如ö,ä,ü,µ。。。我试过: 做。。。 ts因为GHC6.12字符串在输入和输出中作为UTF8处理(或者根据您的语言环境设置使用其他编码)。因此,请确保您的语言环境设置为UTF8 您还可以通过支持许多其他语言环境约定和编码的包手动控制这些内容。您需要将stdin的编码设置为UTF8。对我来说,在Windows XP上,最初在GHCi中设置为CP437,在Mac上设置为UTF8 用hGetEncoding标准输入检查(System.IO),并用hGetEnc

我想从控制台读取包含特殊字符的字符串,如ö,ä,ü,µ。。。我试过:

做。。。
ts因为GHC6.12字符串在输入和输出中作为UTF8处理(或者根据您的语言环境设置使用其他编码)。因此,请确保您的语言环境设置为UTF8


您还可以通过支持许多其他语言环境约定和编码的包手动控制这些内容。

您需要将stdin的编码设置为UTF8。对我来说,在Windows XP上,最初在GHCi中设置为CP437,在Mac上设置为UTF8

hGetEncoding标准输入检查(System.IO),并用
hGetEncoding标准输入utf8设置,它应该可以工作

编辑:这是我的Mac电脑上的外观:

Prelude System.IO> hSetEncoding stdin latin1
Prelude System.IO> str <- getLine
ö
Prelude System.IO> putStr str
öPrelude System.IO> print str
"\195\182"
Prelude System.IO> hSetEncoding stdin utf8
Prelude System.IO> str <- getLine
ö
Prelude System.IO> putStr str
öPrelude System.IO> print str
"\246"
Prelude System.IO>hs编码标准1
前奏曲系统.IO>str putStr
Ã∗序曲系统.IO>print str
"\195\182"
前奏曲系统IO>hs编码标准DIN utf8
前奏曲系统.IO>str putStr
öPrelude System.IO>print str
"\246"

我能够重现您的错误;这看起来像WinGHCi中的一个bug。默认情况下,Windows上的GHC使用Win32“控制台代码页”对句柄I/O进行编码和解码。但是,WinGHCi将输入作为UTF8编码的字节发送到GHC,但错误地将代码页设置为1252(拉丁语-1)

我使用Mike Hartl的答案解决了这个bug:在执行任何行输入命令之前运行
hSetEncoding stdin utf8
。例如:

Prelude> :m +System.IO
Prelude System.IO> hSetEncoding stdin utf8
Prelude System.IO> getLine
ασδφ
"\945\963\948\966"
如果这对您不起作用,请在运行上述命令时告诉我们您得到了什么


或者,在Unicode方面,使用“GHCi”程序(不可否认,它的GUI不太好)可能会有更好的运气。

另请参见您的代码页是什么?尝试在控制台中键入以下命令:
chcp 65001
,然后再次运行Haskell程序,您是否仍然看到此行为?是的,我仍然有相同的问题..任何人都不应使用
text
执行类似的简单任务。作者可能只需检查其区域设置。不过,如果需要的话,您总是可以自己做这件事,这很好。您所说的“将我的语言环境设置为UTF8”是什么意思?我在windows中激活了UTF8,而ghci没有这样的设置,或者我错了?这也不起作用,hGetEncoding stdin(System.IO)给了我:只有CP1252。HSETENCODE标准DIN utf8不会改变任何东西…奇怪。。。当然在我的机器上改变了这一点-见上文。我一直试图在控制台中完成这项工作,现在我已经将hSetEncoding stdin utf8集成到了我的源代码中,一切都很好。显然,不能从控制台更改WinGHCi的代码页。。。
Prelude> :m +System.IO
Prelude System.IO> hSetEncoding stdin utf8
Prelude System.IO> getLine
ασδφ
"\945\963\948\966"