2010-01-18 8 views
24

Non riesco a visualizzare semplicemente i dati con codifica UTF-8 nella console.Utilizzo di Haskell per l'output di un byte codificato in UTF-8

Sono riuscito a farlo usando String, ma ora mi piacerebbe fare lo stesso con ByteString. C'è un modo bello e veloce per fare questo?

Questo è quello che ho finora, e non funziona:

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

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

esso stampa uapaj~�,�, ugh.

Vorrei una risposta per il GHC 6.12.1 più recente, anche se mi piacerebbe sentire le risposte anche per le versioni precedenti.

Grazie!

Aggiornamento: la semplice lettura e l'output della stessa riga di testo con codifica UTF-8 sembra funzionare correttamente. (Utilizzando Data.ByteString.Char8, faccio solo un putStr =<< getLine.) Ma i valori compressi dall'interno del file .hs, come nell'esempio precedente, rifiutano di produrre correttamente ... Devo fare qualcosa di sbagliato?

+0

Quale piattaforma sei? Unicode su piattaforme UNIX-like funziona abbastanza bene ora; Il supporto di Windows è in ritardo. Vedere la documentazione di System.IO: "(nota GHC: su Windows, al momento non supportiamo le codifiche a doppio byte, se la code page della console non è supportata, allora localeEncoding sarà latin1.)" – ephemient

+0

Linux a 64 bit. 'System.IO' non funziona solo con' String'? –

+1

Non dovresti usare 'BS.Char8', perché si presuppone la codifica a 8 bit e tronca i caratteri Unicode multi-byte. Usa normale ByteStrings a meno che tu non sappia * assolutamente * che 'BS.Char8' è il tipo di dati corretto (che include il sapere perché il normale ByteStrings non è esplicitamente il tipo giusto per quel caso d'uso). – David

risposta

24

utf8-string supporta stringhe di byte.

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

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

Noooooooo. :(Ma, sono perplesso ... sembra funzionare bene con le stringhe normali? –

+0

Qualunque cosa sia, è riparato ora. Eseguendo l'esempio indicato nella tua pagina collegata funziona come previsto. La differenza è che sto provando a output ByteStrings codificati in UTF-8 e non in stringhe con codifica UTF-8, che dovrebbe essere più efficiente. Tenere presente che attualmente sto utilizzando GHC 6.12.1, anche se so che il problema non è presente in GHC 6.10 .4 o –

+3

No, in realtà non è questo il problema GHC 6.12 fa utf8 * String * IO, se le impostazioni locali sono impostate su quello. In effetti risolve il bug di cui sopra, che non è il problema che l'OP sta chiedendo. –

20

bytestrings sono stringhe di byte. Quando vengono emessi, verranno troncati a 8 bit, come descritto nella documentazione di Data.ByteString.Char8. Dovrai convertirli esplicitamente in utf8 - tramite il pacchetto utf8-string su Hackage, che contiene il supporto per i bytestrings.


Tuttavia, a partire dal 2011, si dovrebbe usare il pacchetto text, per un veloce, uscita unicode al sacco. GHC truncating Unicode character output

Il vostro esempio diventa molto più semplice:

{-# LANGUAGE OverloadedStrings #-} 

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

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

Come così:

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

La stringa utf8 funziona solo con stringhe e non con ByteStrings? –

+3

No, funziona anche con i bytestrings. Vedi http://stackoverflow.com/questions/2086842/using-haskell-to-output-a-utf-8-encoded-bytestring/2089195#2089195 –

Problemi correlati