GHC中的字符编码问题

时间:2011-12-20 08:19:25

标签: haskell character-encoding

当我尝试从我的Haskell程序中读取纯文本时,我得到:

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

我用谷歌搜索发现这个问题通常是通过将LANG设置为en_US.UTF-8来设置的 这已经是我的语言环境的样子了。

根本不确定这是否与GHC有关。

我在Ubuntu 11.10

1 个答案:

答案 0 :(得分:4)

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

例如,如果你的文字是拉丁文-1那么你会说

hSetEncoding h latin1

其中“h”是您的文件句柄。如果您正在阅读标准输入,那么

hSetEncoding stdin latin1

如果您已经从元数据中读取了编码,或者希望自定义无效Unicode的处理,那么您还可以使用mkTextEncoding函数(尽管这仅适用于某些系统)。

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

(如果您要处理大量文本并且必须处理编码问题,您可能需要考虑使用text库;它通常比使用字符串快很多,因为它使用了未装箱的数组而不是链表,虽然这意味着文本值和操作必须严格。它还允许您更加便携和灵活地配置how to respond to invalid Unicode。)