Char
是Haskell中Unicode字符的类型,和 String
很简单 [Char]
(即一份清单 Char
项目)。这是一些简单的代码:
main = putStrLn "" -- Unicode string
这段代码编译得很好,但是当我在运行它时,我得到了运行时异常 PowerShel.exe 要么 CMD.EXE:
app.exe :: commitBuffer:无效参数(无效字符)
为什么会这样?奇怪的是,当我在C#中做同样的事情时,我也不例外:
Console.WriteLine("");
在.NET中,字符也是Unicode。 电源外壳 要么 CMD 版画 c
代替
,但至少我不例外。如何让Haskell可执行文件顺利运行?
我认为这应该算作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.
在Windows上,修复是告诉shell使用 代码页65001 (这里的说明),将Windows置于“UTF-8模式”。它并不完美,但对于大多数角色,你应该看到unicode角色处理得更好。