unicode haskell io ghc bytestring

unicode - Usando Haskell para producir un ByteString codificado en UTF-8



Me estoy volviendo loco intentando simplemente enviar datos codificados en UTF-8 a la consola.

ByteString lograr esto usando String , pero ahora me gustaría hacer lo mismo con ByteString . ¿Hay alguna manera buena y rápida de hacer esto?

Esto es lo que tengo hasta ahora, y no está funcionando:

import Prelude hiding (putStr) import Data.ByteString.Char8 (putStr, pack) main :: IO () main = putStr $ pack "čušpajž日本語"

Imprime uapaj~ , , ugh.

Me gustaría obtener una respuesta para el último GHC 6.12.1, aunque también me gustaría recibir respuestas para las versiones anteriores.

¡Gracias!

Actualización: simplemente leer y generar la misma línea de texto codificada en UTF-8 parece funcionar correctamente. (Usando Data.ByteString.Char8 , simplemente hago un putStr =<< getLine .) Pero valores empaquetados desde el archivo .hs, como en el ejemplo anterior, se niegan a dar salida correctamente ... ¿Debo estar haciendo algo mal?


bytestrings cadenas de bytes son cadenas de bytes. Cuando Data.ByteString.Char8 , se truncarán a 8 bits, como se describe en la documentación de Data.ByteString.Char8 . Tendrá que convertirlos explícitamente a utf8 - a través del paquete utf8-string en Hackage, que contiene soporte para cadenas de bytes.

Sin embargo, a partir de 2011, debe usar el paquete de text , para una salida rápida y empaquetada de Unicode. GHC trunca la salida de caracteres Unicode

Tu ejemplo se vuelve mucho más simple:

{-# LANGUAGE OverloadedStrings #-} import qualified Data.Text as T import qualified Data.Text.IO as T main = T.putStrLn "čušpajž日本語"

Al igual que:

$ runhaskell A.hs čušpajž日本語


utf8-string admite utf8-string bytes.

import Prelude hiding (putStr) import Data.ByteString.Char8 (putStr) import Data.ByteString.UTF8 (fromString) main :: IO () main = putStr $ fromString "čušpajž日本語"