Кажется, что GHC, по крайней мере, не соответствует кодировке символов, которую он решает декодировать.
Рассмотрим файл omatase-shimashita.txt со следующим содержимым, закодированным в UTF-8: お待たせしました
readFile кажется правильно это прочитал...
Prelude> content <- readFile "/home/chris/Desktop/omatase-shimashita.txt"
Prelude> length content
8
Prelude> putStrLn content
お待たせしました
Однако, если я пишу простой «эхо-сервер», он не декодирует UTF-8 по умолчанию. Рассмотрим следующий код, который обрабатывает входящего клиента:
handleClient handle = do
line <- hGetLine handle
putStrLn $ "Read following line: " ++ toString line
handleClient handle
И соответствующий клиентский код, явно отправляющий UTF-8:
Data.ByteString.hPutStrLn handle $ Codec.Binary.UTF8.Generic.fromString "お待たせしました"
Разве это не непоследовательное поведение? Есть ли метод для этого безумия? Я планирую переписать свои приложения, чтобы явно использовать объекты ByteString и явно кодировать и декодировать с использованием Codec.Binary.UTF8, но в любом случае было бы неплохо знать, что здесь происходит... :o/
ОБНОВЛЕНИЕ: я работаю на Ubuntu Linux версии 10.10 с локалью en_US.UTF-8...
$ cat /etc/default/locale
LANG="en_US.UTF-8"
$ echo $LANG
en_US.UTF-8
Codec.Binary.UTF8для кодирования/декодирования иData.ByteStringдля отправки/получения необработанных байтов. Предположительно, решение chrisdb должно работать; для меня это работало, когда я тестировал его с моим игрушечным сервером/клиентом, но не работал, когда я пробовал его в своем реальном приложении (вероятно, из-за того, что я упустил какую-то деталь, но я потерял терпение и пошел сByteStringподход). - person Chris W.   schedule 14.03.2011