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可执行文件顺利运行?
答案 0 :(得分:9)
在Windows上,修复方法是告诉shell使用code page 65001(instructions 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.