Использование Haskell для вывода байтовой строки в кодировке UTF-8 - PullRequest
25 голосов
/ 18 января 2010

Я схожу с ума, пытаясь просто выводить данные в кодировке UTF-8 на консоль.

Мне удалось сделать это с помощью String, но теперь я бы хотел сделать то же самое с ByteString. Есть ли хороший и быстрый способ сделать это?

Это то, что у меня так далеко, и оно не работает:

import Prelude hiding (putStr)
import Data.ByteString.Char8 (putStr, pack)

main :: IO ()
main = putStr $ pack "čušpajž日本語"

Распечатывает uapaj~�,�, тьфу.

Мне бы хотелось получить ответ для новейшей версии GHC 6.12.1, хотя я также хотел бы услышать ответы и для предыдущих версий.

Спасибо!

Обновление: простое чтение и вывод одной и той же строки текста в кодировке UTF-8, кажется, работает правильно. (Используя Data.ByteString.Char8, я просто делаю putStr =<< getLine.) Но упакованные значения из файла .hs, как в приведенном выше примере, отказываются выводить должным образом ... Я должен что-то делать не так?

Ответы [ 3 ]

26 голосов
/ 19 января 2010

utf8-string поддерживает строки байтов.

import Prelude hiding (putStr)
import Data.ByteString.Char8 (putStr)
import Data.ByteString.UTF8 (fromString)

main :: IO ()
main = putStr $ fromString "čušpajž日本語"
21 голосов
/ 18 января 2010

bytestrings - строки байтов. Когда они выводятся, они будут усечены до 8 бит, как описано в документации для Data.ByteString.Char8. Вам необходимо явно преобразовать их в utf8 - через пакет utf8-string в Hackage, который содержит поддержку строк байтов.


Однако, начиная с 2011 года, вы должны использовать пакет text для быстрого упакованного вывода Unicode. GHC-усечение, вывод символов Unicode

Ваш пример становится намного проще:

{-# LANGUAGE OverloadedStrings #-}

import qualified Data.Text    as T
import qualified Data.Text.IO as T

main = T.putStrLn "čušpajž日本語"

Вот так:

$ runhaskell A.hs
čušpajž日本語
0 голосов
/ 18 января 2010
...