Использование Haskell для вывода байтовой строки в кодировке UTF-8
-
21-09-2019 - |
Вопрос
Я схожу с ума, пытаясь просто вывести данные в кодировке 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, как в приведенном выше примере, отказываются выводиться должным образом...Должно быть, я делаю что-то не так?
Решение
utf8-string
поддерживает байтовые строки.
import Prelude hiding (putStr)
import Data.ByteString.Char8 (putStr)
import Data.ByteString.UTF8 (fromString)
main :: IO ()
main = putStr $ fromString "čušpajž日本語"
Другие советы
bytestrings
представляют собой строки из байтов.Когда они будут выведены, они будут усечены до 8 бит, как описано в документации для Data.ByteString.Char8
.Вам нужно будет явно преобразовать их в utf8 - через utf8-string
пакет на Hackage, который содержит поддержку байтовых строк.
Однако, начиная с 2011 года, вы должны использовать text
пакет для быстрого и упакованного вывода в формате unicode. GHC, усекающий вывод символов Юникода
Ваш пример становится намного проще:
{-# 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ž日本語