2015-05-02 38 views
1

我通常在Linux上開發Haskell程序,然後在Windows上構建並測試它們的一些 。說,我有一些控制檯程序輸出Unicode 符號。特別是,它發生在輸出版權符號 '©',像這樣 :Windows控制檯似乎不喜歡Unicode

Copyright © 2015 Boo 

它可以在Arch Linux的罰款,但在Windows 7中打印類似:

Copyright program_name.EXE: <stdout>: commitAndReleaseBuffer: invalid 
argument (invalid character) 

我不確定,但我認爲在Windows控制檯中輸出unicode符號 應該是可行的,沒有任何額外的魔力。

這裏有兩個問題:

  1. 它是Windows的或Haskell的錯嗎?
  2. 我該如何解決?

P.S.已使用MinGHC,因爲它具有 GHC 7.10。

+0

你需要調用['WriteConsoleW'(https://msdn.microsoft.com/en-us/library/ms687401)(注意「W 「在寬字符API上的後綴),但是這在Haskell中完成。 – eryksun

+0

@eryksun,我天真地認爲高級別Haskell庫可以爲我處理... – Mark

+0

在運行程序之前,請嘗試運行'chcp 65001'。 – chi

回答

1

此函數採用句柄的當前文本編碼並使其替換爲「?」等安全字符。輸出不受控制檯支持的字符時(注:這是Windows控制檯本身不支持這些字符,但Unicode支持大多數其他語言默認應用的變通)

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

它可以是在main功能像這樣的開頭使用:

main = do 
    mapM_ makeSafe [stdout,stderr,stdin] 
    ...