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

时间:2011-09-10 13:23:44

标签: haskell unicode

我想从控制台读取一个包含特殊字符的字符串,例如ö,ä,ü,μ......我试过了:

做......    ts< - getLine    ...

但这对那些角色不起作用。例如,ö的unicode是\ 246,但是如果我使用getLine读取öhaskell读取“\ 195 \ 182”,并且putStr“\ 195 \ 182”给我¶,这不是ö。这有什么问题?我是否需要其他功能来读取这些字符?

我在windows xp上使用WinGHCi 7.0.3。如果有人可以帮助我,我会很高兴,因为到目前为止我找不到任何东西。


@Judah Jacobson:

我再次尝试了,然后输入任何其他命令,并得到了这个:

Prelude> :m +System.IO
Prelude System.IO> hSetEncoding stdin utf8
Prelude System.IO> getLine
ασδφ
"\206\177\207\402\206\180\207\8224"
Prelude System.IO> putStr "\206\177\207\402\206\180\207\8224"
ασδφPrelude System.IO> 

我也试过了windows命令chcp 65001,但它没有改变任何东西,我已经在windows中激活了utf8。

3 个答案:

答案 0 :(得分:3)

因为GHC 6.12字符串在输入和输出中被处理为UTF8(或者根据您的语言环境设置使用其他一些编码)。因此,请确保您的区域设置设置为例如UTF8。

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

答案 1 :(得分:2)

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

使用hGetEncoding stdin(System.IO)进行检查,然后使用hSetEncoding stdin 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"

答案 2 :(得分:1)

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

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

Prelude> :m +System.IO
Prelude System.IO> hSetEncoding stdin utf8
Prelude System.IO> getLine
ασδφ
"\945\963\948\966"

如果这对你不起作用,请告诉我们你在运行上述命令时得到的结果。

或者,对于“GHCi”程序(不可否认,GUI有一个不太好的GUI),你可能会更好地运行Unicode。