2011-12-20 122 views
2

当我试图从我的Haskell程序中读取的纯文本文件,我得到:字符编码问题

[fromlist里*异常:/path/to/file/aaa.txt hGetContents:无效的参数(无效或不完整的多字节或宽字符)

我用Google搜索以发现此问题通常通过将LANG设置为en_US.UTF-8 来设置。这已经是我的语言环境的外观了。

不确定这是否与GHC有关。

我在Ubuntu 11.10

回答

4

确定aaa.txt包含有效的UTF-8?如果是二进制数据,则需要使用withBinaryFile或类似的。如果是另一种编码的文本,则应使用hSetEncoding

举例来说,如果你的文本是Latin-1的,那么你会说

hSetEncoding h latin1 

其中, “H” 是你的文件句柄。如果你是从标准输入读那么它

hSetEncoding stdin latin1 

还有一个mkTextEncoding功能,您可以使用,如果您已经阅读从元数据编码,或想自定义无效的Unicode的处理(虽然这仅适用于一些系统)。

Unicode标准说Unicode解析器应该拒绝错误的无效字符串,而不是试图修复它们。这是故意拒绝Postel's Law,理由是减少安全漏洞和不一致的解释。

(如果您需要处理大量文本并且需要处理编码问题,您可能会考虑使用text库;它通常比使用Strings更快,因为它使用的是非装箱数组而非链接列表,尽管这意味着文本值和对它们的操作必然是严格的,它还允许您更灵活地配置how to respond to invalid Unicode。)

+0

这些是来自gutenberg的纯文本文件。我只是检查,文件说“字符集编码:ISO拉丁-1”什么是使用hSetEncoding的方式?我无法找到一个例子。我试着把行hSetEncoding =“latin1”,它编译,但给出了相同的错误 – atlantis 2011-12-20 09:21:02

+1

'hSetEncoding h latin1',其中'h'是你的文件句柄。你读过一个Haskell教程吗?没有冒犯,只是它使得像使用标准库函数更容易:) – ehird 2011-12-20 09:55:22

+1

(您可以看到TextEncoding值列表[here](http://hackage.haskell.org/packages/archive/base/latest/doc /html/System-IO.html#t:TextEncoding);等价地,通过单击同一页上的hSetEncoding类型签名中的TextEncoding链接)。 – ehird 2011-12-20 09:56:06