Pergunta

Estou saindo da minha mente tentando simplesmente produzir dados codificados por UTF-8 para o console.

Eu consegui fazer isso usando String, mas agora eu gostaria de fazer o mesmo com ByteString. Existe uma maneira agradável e rápida de fazer isso?

É isso que eu tenho até agora, e não está funcionando:

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

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

Imprime uapaj~�,�, eca.

Eu gostaria de uma resposta para o melhor mais novo GHC 6.12.1, embora também queira ouvir respostas para versões anteriores.

Obrigado!

ATUALIZAÇÃO: Simplesmente ler e emitir a mesma linha de texto codificada por UTF-8 parece funcionar corretamente. (Usando Data.ByteString.Char8, Eu apenas faço um putStr =<< getLine.) Mas os valores embalados de dentro do arquivo .hs, como no exemplo acima, recusam -se a produzir corretamente ... devo estar fazendo algo errado?

Foi útil?

Solução

utf8-string supports bytestrings.

import Prelude hiding (putStr)
import Data.ByteString.Char8 (putStr)
import Data.ByteString.UTF8 (fromString)

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

Outras dicas

bytestrings are strings of bytes. When they're output, they will be truncated to 8 bits, as it describes in the documentation for Data.ByteString.Char8. You'll need to explicitly convert them to utf8 - via the utf8-string package on Hackage, which contains support for bytestrings.


However, as of 2011, you should use the text package, for fast, packed unicode output. GHC truncating Unicode character output

Your example becomes a lot simpler:

{-# LANGUAGE OverloadedStrings #-}

import qualified Data.Text    as T
import qualified Data.Text.IO as T

main = T.putStrLn "čušpajž日本語"

Like so:

$ runhaskell A.hs
čušpajž日本語
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top