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