2010-01-18 6 views
24

Ich gehe mir durch den Kopf und versuche, einfach UTF-8-kodierte Daten an die Konsole auszugeben.Verwenden von Haskell, um einen UTF-8-codierten ByteString auszugeben

Ich habe es geschafft, dies mit String zu erreichen, aber jetzt möchte ich das gleiche mit ByteString tun. Gibt es einen schönen und schnellen Weg, dies zu tun? Diese

ist, was ich so weit gekommen, und es funktioniert nicht:

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

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

Es uapaj~�,� ausdruckt, igitt.

Ich hätte gerne eine Antwort für die neueste GHC 6.12.1 am besten, obwohl ich auch Antworten auf frühere Versionen hören möchte.

Danke!

Update: Einfaches Lesen und Ausgeben derselben UTF-8-codierten Textzeile scheint korrekt zu funktionieren. (Mit Data.ByteString.Char8, mache ich nur eine putStr =<< getLine.) Aber gepackte Werte aus der .hs-Datei, wie im obigen Beispiel, weigern sich, richtig auszugeben ... Ich muss etwas falsch machen?

+0

Auf welcher Plattform befinden Sie sich? Unicode auf UNIX-ähnlichen Plattformen funktioniert jetzt ziemlich gut; Die Windows-Unterstützung ist etwas zurückgeblieben. Weitere Informationen finden Sie in der Dokumentation zu System.IO: "(GHC-Hinweis: Unter Windows unterstützen wir derzeit keine Doppelbyte-Codierungen; wenn die Codepage der Konsole nicht unterstützt wird, ist localeEncoding latin1.)" – ephemient

+0

64-Bit-Linux. Funktioniert 'System.IO' nicht nur mit' String'? –

+1

Sie sollten 'BS.Char8' nicht verwenden, da in diesem Fall die 8-Bit-Codierung vorausgesetzt wird und Unicode-Zeichen mit mehreren Byte abgeschnitten werden. Verwenden Sie normale ByteStrings, es sei denn, Sie wissen absolut, dass 'BS.Char8' der richtige Datentyp ist (einschließlich der Tatsache, dass normale ByteStrings explizit nicht der richtige Typ für diesen Anwendungsfall sind). – David

Antwort

24

utf8-string unterstützt bytestrings.

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

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

Noooooooo. :(Aber, ich bin verwirrt ... es scheint mit regulären Strings funktionieren? –

+0

Was auch immer das ist, ist es jetzt behoben. Ausführen des Beispiels auf Ihrer verknüpften Seite funktioniert wie erwartet. Der Unterschied ist, dass ich versuche Ausgabe von UTF-8-kodierten ByteStrings, und nicht von UTF-8-kodierten Strings, was effizienter sein soll .. Beachten Sie, dass ich momentan GHC 6.12.1 verwende, obwohl ich weiß, dass das Problem in GHC 6.10 nicht existiert .4 entweder. –

+3

Nein, das ist nicht das Problem, GHC 6.12 hat utf8 * String * IO, wenn das Gebietsschema darauf eingestellt ist, was tatsächlich den obigen Fehler behebt, was nicht das Problem ist, nach dem das OP fragt. –

20

bytestrings sind Strings von Bytes. Wenn sie ausgegeben werden, werden sie auf 8 Bit gekürzt, wie in der Dokumentation für Data.ByteString.Char8 beschrieben. Sie müssen sie explizit in utf8 konvertieren - über das utf8-string Paket auf Hackage, das Unterstützung für Bytestrings enthält.


jedoch ab 2011, sollten Sie das text Paket verwenden, für die schnellen, verpackt Unicode-Output. GHC truncating Unicode character output

Ihr Beispiel wird viel einfacher:

{-# LANGUAGE OverloadedStrings #-} 

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

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

Wie so:

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

Funktioniert utf8-string nicht nur mit Strings und nicht mit ByteStrings? –

+3

Nein, es funktioniert auch mit Bytestrings. Siehe http://stackoverflow.com/questions/2086842/using-haskell-to-output-a-utf-8-encoded-bytestring/2089195#2089195 –