2010-01-18 11 views
24

Me estoy volviendo loco intentando simplemente enviar datos codificados en UTF-8 a la consola.Usando Haskell para dar salida a una ByteString codificada en UTF-8

Lo he logrado con 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 que no está funcionando:

import Prelude hiding (putStr) 
import Data.ByteString.Char8 (putStr, pack) 

main :: IO() 
main = putStr $ pack "čušpajž日本語" 

imprime uapaj~�,�, uf.

Me gustaría obtener una respuesta para el último GHC 6.12.1 mejor, 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, acabo de hacer un putStr =<< getLine). Pero los valores empaquetados desde dentro del archivo .hs, como en el ejemplo anterior, se niegan a dar salida correctamente ... ¿Debo estar haciendo algo mal?

+0

¿En qué plataforma estás? Unicode en plataformas tipo UNIX funciona bastante bien ahora; El soporte de Windows se está retrasando un poco. Consulte la documentación de System.IO: "(Nota de GHC: en Windows, actualmente no admitimos codificaciones de doble byte, si la página de códigos de la consola no es compatible, entonces localeEncoding será latin1)" – ephemient

+0

Linux de 64 bits. ¿'System.IO' no funciona solo con' String'? –

+1

No debe usar 'BS.Char8', porque eso supone una codificación de 8 bits y trunca caracteres Unicode de varios bytes. Use ByteStrings normales a menos que * completamente * sepa * que 'BS.Char8' es el tipo de datos correcto (eso incluye saber por qué ByteStrings normales no son explícitamente del tipo correcto para ese caso de uso). – David

Respuesta

24

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

Noooooooo. :(Pero, estoy perplejo ... parece que funciona bien con Strings normal? –

+0

Sea lo que sea, ahora está arreglado. Ejecutar el ejemplo dado en la página vinculada funciona como se espera. La diferencia es que estoy intentando salida ByteStrings con codificación UTF-8, y no Cadenas con codificación UTF-8, que se supone que es más eficiente. Tenga en cuenta que actualmente estoy usando GHC 6.12.1, aunque sé que el problema no existe en GHC 6.10 .4. –

+3

No, ese no es realmente el problema. GHC 6.12 hace utf8 * String * IO, si la configuración regional está configurada para eso. Lo que de hecho resuelve el error anterior, que no es el problema que el OP está preguntando. –

20

bytestrings son cadenas de bytes. Cuando salgan, se truncarán a 8 bits, como se describe en la documentación para 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, se debe utilizar el paquete text, para, salida rápida Unicode lleno. GHC truncating Unicode character output

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

así:

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

¿No funciona utf8-string solo con Strings, y no con ByteStrings? –

+3

No, también funciona con cadenas de bytes. Ver http://stackoverflow.com/questions/2086842/using-haskell-to-output-a-utf-8-encoded-bytestring/2089195#2089195 –

Cuestiones relacionadas