Usando Haskell para emitir una ByteString UTF-8-codificada
-
21-09-2019 - |
Pregunta
Me voy fuera de mi mente tratando de datos codificados en UTF-8 simplemente salida a la consola.
Me las he arreglado para lograr esto usando String
, pero ahora me gustaría hacer lo mismo con ByteString
. ¿Hay una manera agradable y rápido para hacer esto?
Esto es lo que tengo hasta ahora, y que no está funcionando:
import Prelude hiding (putStr)
import Data.ByteString.Char8 (putStr, pack)
main :: IO ()
main = putStr $ pack "čušpajž日本語"
Se imprime uapaj~�,�
, uf.
Me gustaría una respuesta para la nueva GHC 6.12.1 mejor, aunque me gustaría escuchar respuestas para las versiones anteriores también.
Gracias!
Actualización: La simple lectura y la salida de la misma línea con codificación UTF-8 del texto parece funcionar correctamente. (El uso de Data.ByteString.Char8
, acabo de hacer un putStr =<< getLine
.) Pero que está lleno de valores dentro del archivo .hs, como en el ejemplo anterior, se niegan a salir correctamente ... Debo estar haciendo algo mal?
Solución
utf8-string
soporta cadenas de bytes.
import Prelude hiding (putStr)
import Data.ByteString.Char8 (putStr)
import Data.ByteString.UTF8 (fromString)
main :: IO ()
main = putStr $ fromString "čušpajž日本語"
Otros consejos
bytestrings
son cadenas de bytes. Cuando están de salida, que serán truncados a 8 bits, ya que describe en la documentación de Data.ByteString.Char8
. Tendrá que convertir explícitamente a utf8 -. A través del paquete de utf8-string
en Hackage, que contiene soporte para cadenas de bytes
Sin embargo, a partir de 2011, se debe utilizar el paquete text
, para, salida rápida Unicode lleno. GHC truncar caracteres Unicode de salida
Su ejemplo se convierte en 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ž日本語