Ответ 1
utf8-string
поддерживает байты.
import Prelude hiding (putStr)
import Data.ByteString.Char8 (putStr)
import Data.ByteString.UTF8 (fromString)
main :: IO ()
main = putStr $ fromString "čušpajž日本語"
Я сойду с ума, пытаясь просто вывести данные на 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, как в приведенном выше примере, отказываются выводить правильно... Я должен делать что-то неправильно?
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 усекает вывод символов 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ž日本語