web-dev-qa-db-ja.com

テキストまたはバイト文字列

良い一日。

Haskellで今嫌いなのは、文字列を扱うためのパッケージの量です。

最初にネイティブのHaskell [Char]文字列を使用しましたが、ハッキングライブラリを使い始めようとしたところ、無限の変換で完全に失われました。すべてのパッケージは異なる文字列実装を使用しているようで、一部は独自の手作りのものを採用しています。

次に、Data.Text文字列とOverloadedStrings拡張子を使用してコードを書き直しました。Textを選択しました。これは、関数の幅が広いためですが、多くのプロジェクトがByteStringを好むようです。
誰かがなぜどちらか一方を使用する理由を簡潔に説明できるでしょうか?

PS:ところで、TextからByteStringに変換する方法は?

予想されるタイプData.ByteString.Lazy.Internal.ByteStringを推定されるタイプTextと照合できませんでした:予想されるタイプ:IO Data.ByteString.Lazy.Internal.ByteString推定タイプ:IO Text

encodeUtf8Data.Text.Encodingを試しましたが、うまくいきませんでした:

予想されるタイプData.ByteString.Lazy.Internal.ByteStringを推定タイプData.ByteString.Internal.ByteStringと照合できませんでした

PD:

*チャンクの良さは進むべきように見えますが、結果に少しショックを受け、元の関数は次のようになりました。

htmlToItems :: Text -> [Item]
htmlToItems =
    getItems . parseTags . convertFuzzy Discard "CP1251" "UTF8"

そして今なりました:

htmlToItems :: Text -> [Item]
htmlToItems =
    getItems . parseTags . fromLazyBS . convertFuzzy Discard "CP1251" "UTF8" . toLazyBS
    where
      toLazyBS t = fromChunks [encodeUtf8 t]
      fromLazyBS t = decodeUtf8 $ intercalate "" $ toChunks t

そして、はい、この関数は間違っているので機能しません。Textを指定すると、このテキストが適切にエンコードされ、使用できる状態にあり、変換するのは愚かですが、そのような冗長な変換は、htmltoItems以外の場所で行う必要があります。

76
Dfr

ByteStringsは主にバイナリデータに役立ちますが、必要なのがASCII文字セットのみである場合、テキストを処理する効率的な方法でもあります。Unicode文字列を処理する必要がある場合は、Textを使用する必要があります。ただし、どちらも他の代替品ではないことを強調する必要があります。これらは通常、さまざまな目的で使用されます。Textは純粋なユニコードを表しますが、たとえばソケットを介してテキストを転送する場合は常に、バイナリのByteString表現との間でエンコードする必要があります。またはファイル。

これはユニコードの基本についての良い記事です。ユニコードコードポイント(Text)とエンコードされたバイナリバイト(ByteString)の関係を説明する適切な仕事をします: The Absolute Minimum Everyソフトウェア開発者は絶対に、積極的にUnicodeと文字セットについて知っておく必要があります

Data.Text.Encoding モジュールを使用して2つのデータ型間で変換するか、 Data.Text.Lazyを使用できます。 .Encoding 遅延バリアントを使用している場合(エラーメッセージに基づいて実行しているように見える場合)。

64
shang

あなたは間違いなくData.Textをテキストデータに使用したいです。

encodeUtf8は進むべき道です。このエラー:

予想される型Data.ByteString.Lazy.Internal.ByteStringを推定型Data.ByteString.Internal.ByteStringと照合できませんでした

lazyバイト文字列を期待するコードにstrictバイト文字列を提供していることを意味します。変換はfromChunks関数で簡単です:

Data.ByteString.Lazy.fromChunks :: [Data.ByteString.Internal.ByteString] -> ByteString

だからあなたがする必要があるのは関数fromChunks [myStrictByteString]遅延バイト文字列が必要な場所。

逆の変換は、遅延バイト文字列を取り、厳密なチャンクのリストを提供するデュアル関数toChunksを使用して実行できます。

一部のパッケージのメンテナーに、バイトストリングインターフェースの代わりに、またはバイトストリングインターフェースに加えて、テキストインターフェースを提供できるかどうかを尋ねることができます。

26
John L

_Data.String.Conversions_から単一の関数csを使用します。

入力と予想される型に応じて、StringByteStringText(および_ByteString.Lazy_と_Text.Lazy_)の間で変換できます。

あなたはまだそれを呼び出す必要がありますが、それぞれのタイプについて心配する必要はありません。

使用例については this answer を参照してください。

5
Titou