Char
是Haskell中Unicode字符的类型,并且String
很简单[Char]
(即Char
项目列表)。这是一些简单的代码:
main = putStrLn "©" -- Unicode string
这段代码可以正常编译,但是当我在PowerShel.exe或cmd.exe中运行它时,我得到了运行时异常:
app.exe::commitBuffer:无效参数(无效字符)
为什么会这样?奇怪的是,当我在C#中执行相同操作时,我没有例外:
Console.WriteLine("©");
在.NET中,字符也是Unicode。PowerShell或cmdc
代替打印©
,但至少我没有例外。如何使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.
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句