Haskell GHC中的字符编码问题
当我尝试从Haskell程序中读取纯文本文件时,我得到: [fromList*异常:/path/to/file/aaa.txt hGetContents:无效参数(无效或不完整的多字节或宽字符) 我在谷歌上搜索发现这个问题通常通过将LANG设置为en_US.UTF-8来解决 我的区域设置已经是这样了 不确定这是否是GHC的问题Haskell GHC中的字符编码问题,haskell,character-encoding,Haskell,Character Encoding,当我尝试从Haskell程序中读取纯文本文件时,我得到: [fromList*异常:/path/to/file/aaa.txt hGetContents:无效参数(无效或不完整的多字节或宽字符) 我在谷歌上搜索发现这个问题通常通过将LANG设置为en_US.UTF-8来解决 我的区域设置已经是这样了 不确定这是否是GHC的问题 我在Ubuntu 11.10上,你确定aaa.txt包含有效的UTF-8吗?如果它是二进制数据,你需要使用或类似的格式。如果它是另一种编码的文本,你应该使用 例如,如果你
我在Ubuntu 11.10上,你确定aaa.txt包含有效的UTF-8吗?如果它是二进制数据,你需要使用或类似的格式。如果它是另一种编码的文本,你应该使用 例如,如果你的文本是拉丁语-1,那么你会说
hSetEncoding h latin1
其中“h”是您的文件句柄。如果您是从标准输入读取,则其
hSetEncoding stdin latin1
如果您已经从元数据中读取了编码,或者希望自定义无效Unicode的处理,也可以使用一个函数(尽管这仅适用于某些系统)
Unicode标准规定Unicode解析器应该拒绝带有错误的无效字符串,而不是试图修复它们。这是一种故意拒绝,理由是减少了安全漏洞和不一致的解释
(如果您要处理大量文本并必须处理编码问题,您可能需要考虑使用该库;它通常比使用字符串快得多,因为它使用了一个未装箱的数组而不是一个链表,虽然这意味着文本值和操作对它们来说一定是严格的。它还允许您配置更多的POR。这些是古腾堡的纯文本文件。我刚检查过,文件上写着“字符集编码:ISO拉丁-1”使用HSETencode的方法是什么?我找不到一个例子。我试着把HSETencode=“latin1”一行它进行编译,但给出了相同的错误
hSetEncoding h latin1
,其中h
是您的文件句柄。您读过Haskell教程吗?无意冒犯,它只是让使用标准库函数等事情变得更容易:)(您可以看到TextEncoding值的列表;通过在同一页面上单击hSetEncoding的类型签名中的TextEncoding链接,可以看到TextEncoding值的列表。)linux下的默认TextEncoding模式是从LANG开始的,因此该文件必须是utf8编码的文件,而不是iso-8859文件。@Jonke:对,这就是为什么如果知道编码是什么,就应该使用hSetEncoding:)