2

Textインスタンスを取得するときにutf8文字を解析するのに問題がありReadます。たとえば、ghciで次のように実行すると...

> import Data.Text
> data Message = Message Text deriving (Read, Show)
> read ("Message \"→\"") :: Message
Message "\8594"

Messageutf-8内のテキストをエンコードしておくために何かできますか?つまり、結果は次のようになります...

Message "→"

(PS私はすでにシリアル化されたメッセージをとして受信していますTextが、現在、電話をかけるためににunpack送信する必要があります。これを避けたいです...)Stringread

編集:ああ、申し訳ありませんが、答えは正しく、どちらに変換されるかでshowはないことを指摘しています-バックスラッシュエンコーディングなしで再び変換する方法はありますか?read"\8594"showText

4

1 に答える 1

5

私の知る限り、Text実際にはUTF-16である)によって使用される内部エンコーディングは一貫しており、直接公開されていません。TextUTF-8が必要な場合は、必要に応じて値をデコード/エンコードできます。同様に、のエンコーディングについて話すのは意味がありません。これはString、のリストでありChar、それぞれCharがユニコードコードポイントであるためです。

ほとんどの場合、これは、ここで物事を異なる方法で表示するShowためのインスタンスにすぎません。Text

readまた、(標準ライブラリでの一貫した規則により)とshowは、(デ)シリアル化関数として動作することが期待されていることを覚えておいてください。「シリアル化」形式は、Haskell式として解釈され、(逆シリアル化。そのため、ASCIIテキストを使用したスラッシュエンコーディングは、広くサポートされ、明確であるために好まれることがよくあります。Text実際のコードポイントで値を表示したい場合は、showそれはあなたが望むものではありません。


私はあなたが何をしたいのか完全には明確ではありませんText-show直接使用することはあなたが避けようとしていることです。エンコーディングを指示するターミナルウィンドウにテキストを表示したい場合、およびで定義されたものが必要な場合Data.Text.IO。他の理由で特定のエンコーディングに変換する必要がある場合は、エンコードされたものにData.Text.EncodingなりますByteString(「文字列」ではなく「バイト」に重点が置かれます。aByteStringは文字列ではなく生のバイトのシーケンスです)。

に変換したり、に変換Textしたりするだけの場合...スラッシュエンコーディングの何が問題になっていますか?多くの人が最初に期待していたにもかかわらず、ユーザーが読むためのきれいな印刷出力を実際に意図したものではありません。StringTextshow

于 2012-09-11T20:25:00.020 に答える