尝试打印Unicode字符时出现运行时异常

时间:2014-12-23 08:25:56

标签: haskell ghc

Char是Haskell中Unicode字符的类型,String只是[Char](即Char项列表)。这是一些简单的代码:

main = putStrLn "©" -- Unicode string

这段代码编译得很好,但是当我在 PowerShel.exe cmd.exe 中运行它时,我得到了运行时异常:

  

app.exe :: commitBuffer:无效参数(无效字符)

为什么会这样?奇怪的是,当我在C#中做同样的事情时,我也不例外:

Console.WriteLine("©");

在.NET中,字符也是Unicode。 PowerShell cmd 打印c代替©,但至少我不会例外。如何让我的Haskell可执行文件顺利运行?

2 个答案:

答案 0 :(得分:9)

在Windows上,修复方法是告诉shell使用code page 65001instructions here),这会将Windows置于“UTF-8模式”。它并不完美,但对于大多数角色来说,你应该看到unicode角色处理得更好。

答案 1 :(得分:5)

我认为这应该算作GHC中的一个错误,但有一个解决方法。 GHC程序中所有句柄的默认编码(在二进制模式下打开的除外)只是控制台接受的编码,没有错误处理。幸运的是,您可以使用类似的方式添加错误处理。

makeSafe h = do
  ce' <- hGetEncoding h
  case ce' of
    Nothing -> return ()
    Just ce -> mkTextEncoding ((takeWhile (/= '/') $ show ce) ++ "//TRANSLIT") >>=
      hSetEncoding h

main = do
  mapM_ makeSafe [stdout, stdin, stderr]
  -- The rest of your main function.