2011-07-24 120 views
4

下面的代碼打印像°Ð½Ð´Ð¸Ñ-ÐÑпаниÑSystem.Directory.getDirectoryContents Unicode支持

getDirectoryContents "path/to/directory/that/contains/files/with/nonASCII/names" 
    >>= mapM_ putStrLn 

看起來它是一個GHC bug並且在存儲庫已經固定。但是在每個人升級ghc之前該怎麼辦?我最後一次遇到這樣的問題(這是幾年前,順便說一句),我用utf8字符串包來轉換字符串,但我不記得我是如何做到的,並且ghc unicode支持被顯着地改變了去年。

那麼,什麼是最好(或至少工作)的方式來獲得完整的Unicode支持的目錄內容?

GHC版本7.0.4 區域的en_US.UTF-8

回答

5

下面是使用decodeStringencodeStringutf8-string一個簡單的解決方法。

import System.Directory 
import qualified Codec.Binary.UTF8.String as UTF8 

main = do 
    getDirectoryContents "." >>= mapM_ (putStrLn . UTF8.decodeString) 
    putStrLn "------------" 
    readFile (UTF8.encodeString "brøken-file-nåme.txt") >>= putStrLn 

輸出:

. 
.. 
brøken-file-nåme.txt 
Broken.hs 
------------ 
hello 
+0

謝謝,它的工作原理。它會用新的ghc嗎? – Yuras

+0

@Yuras:根據我的理解,'base'對於UTF8轉換本身,因此如果使用適當版本的'base',您可能想要使用條件編譯來移除轉換。 – hammar

3

我會建議看system-filepath,它提供了代表文件路徑的抽象數據類型。我已經廣泛地使用了它的一些內部代碼,它的工作非常好。

+0

謝謝。它就像'fixName = encodeString。 fromText。 T.pack' –