Кажется, что 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