当我尝试从我的Haskell程序中读取纯文本时,我得到:
[fromList * 异常:/ path / to / file / aaa.txt hGetContents:无效参数(无效或不完整的多字节或宽字符)
我用谷歌搜索发现这个问题通常是通过将LANG设置为en_US.UTF-8来设置的 这已经是我的语言环境的样子了。
根本不确定这是否与GHC有关。
我在Ubuntu 11.10
答案 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。)