1. ホーム
  2. string

テキストまたはバイト列

2023-08-05 15:57:16

質問

ごきげんよう。

私が今Haskellについて嫌いなことの一つは、文字列を扱うためのパッケージの量です。

最初に私はネイティブのHaskell [Char] の文字列を使っていましたが、Haskellのライブラリを使い始めると、果てしない変換で完全に迷子になってしまいました。パッケージによって文字列の実装が違うようで、独自の手作りのものを採用しているところもあります。

次に、私は自分のコードを Data.Text という文字列と OverloadedStrings を拡張する場合、私は Text を選択しましたが、多くのプロジェクトが ByteString .

誰か、どちらかを使うべき理由を簡単に教えてください。

PS:どのように変換するためにtw Text から ByteString ?

期待された型と一致しません Data.ByteString.Lazy.Internal.ByteStringにマッチしませんでした。 推論された型に対して テキスト 期待される型 IO データ.ByteString.Lazy.Internal.ByteString 推測される型 IO Text

試しに encodeUtf8 から Data.Text.Encoding に変更しましたが、うまくいきませんでした。

期待された型にマッチしませんでした。 Data.ByteString.Lazy.Internal.ByteStringにマッチしませんでした。 推論された型に対して Data.ByteString.Internal.ByteString。

UPDです。

回答ありがとうございます、その*Chunksの良さは行く方法のように見えますが、私は結果にややショックを受けました、私の元の関数は次のようになりました。

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 .

どのように解決するのですか?

ByteStrings は主にバイナリデータに有用ですが、ASCII文字セットしか必要ない場合は、テキストを処理する効率的な方法でもあります。ユニコード文字列を処理する必要がある場合は Text . しかし、どちらも他を置き換えるものではなく、一般に異なる目的で使用されることを強調しておかなければなりません:一方 Text は純粋なユニコードを表しますが、バイナリの ByteString 表現との間でエンコードする必要があります。

ユニコードの基本に関する良い記事があります。ユニコードのコードポイント( Text ) とエンコードされたバイナリバイト ( ByteString ): すべてのソフトウェア開発者が Unicode と文字セットについて絶対に、絶対に知っておかなければならない最低限事項

このような場合 データ.テキスト.エンコーディング モジュールを使って2つのデータ型を変換するか、あるいは Data.Text.Lazy.Encodingを使用します。 を使うかです (エラーメッセージからするとそうなっているようです)。