2012-04-17 2 views
2

Я тестирую что-то, что нравится выводить содержимое в файл с китайским именем.Prelude.writeFile с китайским именем файла

Файл будет создан с правильным контентом, но не с именем файла.

Я рассматриваю функцию writeFile^1 и представляет имя файла, используя String. Поэтому я подозреваю, что это может быть основной причиной.

file :: FilePath 
    file = "上海万达影城.html" 

    content :: String 
    content = "<h1>hello</h1>" 

    write2File :: IO() 
    write2File = writeFile file content 

Благодаря вашей помощи!

-Simon

--------------------- Обновлено

  1. GHC на моей стороне 7.0.2
  2. Обходной путь, обнаруженный до обновления. подробности см ниже и изменения кода, как

    import qualified Codec.Binary.UTF8.String as UTF8 
    file = UTF8.encodeString "上海万达影城.html" 
    
+0

http://stackoverflow.com/questions/3412577/haskell-char-unicode-and-turkish –

+0

работает здесь с GHC-7.4.1, какую версию компилятора и ОС есть ли? –

+0

@ Даниэль, я работаю над ghc-7.0.2, поэтому я думаю, что сначала попробую решение, упомянутое Дитрихом Эппом. – Simon

ответ

3

Струнный список точек Юникода кода в Haskell. Интерпретация этого списка кодов Юникода зависит от системы. (Вам также нужен не слишком старый GHC для поддержки этого).

В общем, хотя, как только вы устанавливаете язык вручную, все работает.


N.B. в прошлом были предостережения - например, старая ошибка: System.Directory.getDirectoryContents unicode support - что может вызвать обходные пути.

+0

Спасибо Дона. Обходной путь работает как прелесть. – Simon

0

А пока вы можете использовать модуль System.Posix.IO.ByteString. Это позволит вам указать пути к файлам как строки байтов, поэтому вы можете сами выполнить кодирование/декодирование.

Это известная ошибка и исправлена ​​в 7.2.1.

http://hackage.haskell.org/trac/ghc/ticket/3307

+0

Кажется, unix-2.5. * У пакета есть 'System.Posix.IO.ByteString', но я работаю над unix-2.4. Я проверю его снова, когда у меня появится шанс обновить GHC. Спасибо Дитриху. – Simon

Смежные вопросы