Haskell:quoteFile在unicode字符上的“无效字节序列”的文本文件上失败

时间:2015-05-24 09:13:45

标签: linux haskell unicode encoding utf-8

我的虚拟环境中遇到quoteFile问题(安装了GHC 7.8.4的Debian Wheezy)。我已经从st描述了Text.Shakespeare.Text准引号的面向文件的版本:

import Language.Haskell.TH.Quote    (QuasiQuoter, quoteFile)
import Text.Shakespeare.Text        (st)

sfFile :: QuasiQuoter
stFile = quoteFile st

这在我的主机上运行良好,但是,这在我的虚拟环境(Docker镜像)上出现以下错误时失败:

  

尝试运行编译时代码时出现异常:     test-file.md:hGetContents:无效参数(无效字节序列)

     

代码:Language.Haskell.TH.Quote.quoteExp           stFile“test-file.md”

我的REPL调查显示,文本文件中的第一个unicode字符发生错误,在我目前的情况下,这是'«'左指针双角引号:

import System.IO (IOMode(..), hGetContents, openFile, openBinaryFile, utf8)

main =
  do h <- openBinaryFile "test-file.md" ReadMode
     hGetContentContents h
     -- Binary read works fine out-of-box.

     h' <- openFile "test-file.md" ReadMode
     hSetEncoding h' utf8
     hGetContentContents h'
     -- This works only if encoding is explicitly set, otherwise 
     -- it gives "invalid byte sequence" error at run-time

在我看来,我需要配置一点我的虚拟环境,或者可能需要重建GHC本身。

我尝试将语言环境设置为en.UTF-8 UTF-8,但这没有帮助(最初我根本没有进行语言环境配置)。

更新:目标文件具有UTF-8编码:

$ file -bi test-file.md
text/x-c++; charset=utf-8

1 个答案:

答案 0 :(得分:4)

最后,我发现我的虚拟语言环境没有正确设置,例如locale命令向我显示所有LANG个变量都设置为POSIX

LANG变量导出为命令是最快的解决方法( bash 示例):

export LANG=en_US.uft8 cabal build

但是,您可能需要安装en_US语言环境,Debian手动配置为:

  1. 修改文件/etc/locale.gen,添加新行en_US.UTF-8 UTF-8
  2. 调用locale-gen生成区域设置。
  3. 导出LANG变量。
  4. Debian locales wiki 1

    P.S。我的默认 Debian Wheezy 安装在默认语言环境列表中有C.UTF-8,所以我相信极简主义的目的是可以使用它而不是安装其他英语语言环境,但我没有测试它自己。