linux - Haskell:quoteFile 在 unicode 字符上带有 "invalid byte sequence"的文本文件上失败

标签 linux haskell unicode encoding utf-8

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

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

sfFile :: QuasiQuoter
stFile = quoteFile st

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

Exception when trying to run compile-time code: test-file.md: hGetContents: invalid argument (invalid byte sequence)

Code: 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

最佳答案

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

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

export LANG=en_US.UTF8 cabal build

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

  1. 编辑文件/etc/locale.gen,添加新行en_US.UTF-8 UTF-8
  2. 调用 locale-gen 生成语言环境。
  3. 导出 LANG 变量。

Debian 语言环境维基 1

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

关于linux - Haskell:quoteFile 在 unicode 字符上带有 "invalid byte sequence"的文本文件上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30421845/

相关文章:

linux - 一般而言,在 ucLinux 上,ioctl 是否比写入/sys 文件系统更快?

linux - AWS/Ubuntu 存档服务器似乎已关闭?

linux - 打印指针 : can the leading 0x be eliminated?

haskell - 为什么 haskell 编译器可以推断出这种类型,而 ghci 不能?

python - 加入时出现 UnicodeDecodeError

java - 如何将平假名转换为半角片假名?

python - IF 语句 : Shell to python

windows - Windows 上的 Haskell 插件包不是 x86 PEi386 错误

haskell - 在 Nvidia Jetson TK1(ARM 架构)上安装 haskell 平台

delphi - 那些想要从Delphi 7(及更低版本)升级到Delphi 2010的人有什么建议吗?