Beim Versuch, einen ByteString zu lesen, lief ich immer den folgenden Fehler auf:
Prelude.read: no parse
Hier ist ein Beispielcode, der dazu führt, dass dieser Fehler beim Rendern in einem Browser auftritt:
%Vor%Oder vielleicht einfacher:
%Vor% Aus irgendeinem Grund enthält die resultierende Zeichenfolge nach show bs
Anführungszeichen.
Um den Fehler zu umgehen, muss ich die Anführungszeichen entfernen und dann read
it.
Ich verwende die folgende aus dem Internet kopierte Funktion:
Dann funktioniert simple bs = read (sq.show bs) :: Int
wie erwartet.
Show
wird verwendet, um eine String
-Darstellung von etwas zu erstellen, das für Debugging und Plain-Text-Serialisierung nützlich ist. Die Show
typeclass ist nicht nur eine raffinierte Art, etwas in ein String
zu konvertieren. Deshalb fügt ByteString
der Zeichenfolge Zitate hinzu: weil es beim Debuggen oder Deserialisieren eines Datenstroms einfacher zu lesen ist.
Sie können die Data.ByteString.Char8.unpack
verwenden. Funktion zum Konvertieren eines ByteString
in ein String
, aber beachten Sie, dass dies das ByteString
Byte pro Byte entpackt, wodurch hochwertige Unicode-Zeichen oder andere Zeichen, die als mehr als eins gespeichert sind, durcheinander gebracht werden Byte; Wenn Sie etwas anderes tun möchten als read
für das Ergebnis zu verwenden, würde ich empfehlen, das ByteString
in Text
stattdessen, was in dieser Situation mehr Flexibilität bietet. Angenommen, Ihre Kodierung ist UTF8 in diesem Fall (Wie es in Snap standardmäßig der Fall sein sollte), können Sie das Data.Text.Encoding.decodeUtf8
Funktion hierfür. Um dann einen Text
-Wert in ein String
mit korrekten Unicode-Symbolen zu konvertieren, verwenden Sie Data.Text.unpack
.
Sobald du String
hast, kannst du read
so viel wie du willst; alternativ können Sie einen Text
-Wert direkt mit den Funktionen im Data.Text.Read
Modul.
Welcher der beste Weg, um ByteString
in X
umzuwandeln, hängt von X
ab. Wenn Sie eine gute Conversion von String
haben, kann die Verwendung von Data.BytString.Char8.unpack
gut sein, wenn es sich um ein ASCII ByteString
handelt. Für das UTF-8-codierte ByteString
s enthält das Paket utf8-string die Konvertierungsfunktion toString
. Für einige spezielle Typen wie Int
, wie im Titel erwähnt, gibt es spezielle schnellere Konvertierungen. Zum Beispiel Data.ByteString.Char8.readInt
und readInteger
.
Tags und Links haskell bytestring