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

StackOverflow https://stackoverflow.com/questions/2086842

Вопрос

Я схожу с ума, пытаясь просто вывести данные в кодировке 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ž日本語
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top