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

6
我想从控制台读取一个包含特殊字符如ö,ä,ü,µ的字符串。我已经尝试过以下方法:
```haskell do ... 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。


2
你的代码页是什么?尝试在控制台中输入以下命令:chcp 65001,然后再次运行你的Haskell程序,你是否仍然看到这种行为? - n. m.
是的,我仍然有同样的问题。 - Alex
3个回答

3

自从 GHC 6.12 版本以后,字符串在输入和输出时被处理为 UTF8 编码(或其他基于你的本地设置的编码)。因此,请确保你的本地设置为 UTF8。

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


1
没有人应该像这样简单的任务一样使用 text - n. m.
1
嗯,作者可能只需要检查他们的区域设置。然而,如果需要的话,自己做也是好的。 - Don Stewart
“将我的语言环境设置为UTF8”是什么意思?我在Windows中激活了UTF8,但ghci中没有这样的设置,或者我错了吗? - Alex

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"

这个也不起作用,hGetEncoding stdin (System.IO) 给了我:只是 CP1252。hSetEncoding stdin utf8 毫无变化... - Alex
奇怪...在我的机器上肯定会改变 - 请参见上面。 - firefrorefiddle
我一直试图在控制台中完成它,现在我已经将 hSetEncoding stdin utf8 集成到我的源代码中,一切都正常工作了。显然,无法从控制台更改WinGHCi的代码页... - Alex

1
我能够重现你的错误;这看起来像是WinGHCi中的一个bug。在Windows上,默认情况下,GHC使用Win32“控制台代码页”来编码和解码Handle I/O。然而,WinGHCi将输入发送到GHC作为UTF8编码的字节,但错误地将代码页设置为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"

如果这对你不起作用,请告诉我们当你运行上述命令时得到的结果。
换个方式说,对于 Unicode 方面来说,使用 "GHCi" 程序可能会更顺利(尽管它的 GUI 不太好看)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接