Подтвердить что ты не робот

Использование Haskell для вывода ByteString с кодировкой UTF-8

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

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

Это то, что у меня есть до сих пор, и оно не работает:

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

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

Он выводит uapaj~�,�, ugh.

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

Спасибо!

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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ž日本語