2011-09-25 8 views
5

latin-1(別名ISO-8859-1)文字セットはUnicode文字セットの最低256のコードポイントとして埋め込まれているため、変換は簡単ではありませんが、一般的なUTFエンコーディングの変換関数のみを含むData.Text.Encodingにはlatin-1エンコーディング変換関数はありませんでした。Latin1でエンコードされたData.ByteStringとData.Textの間の変換

Data.ByteStringの値をlatin-1表現でエンコードした値とData.Textの値の間で変換することをお勧めしますか、または効率的な方法はありますか?

+1

ところで、「latin-1文字セットはUnicode文字セットの最低256コードポイントとして埋め込まれているため、変換は些細なものだと思います」というのは不当です。 1つのコードポイント・ストリームを2つの異なるエンコーディングでエンコードした結果のバイトストリームが、互いに些細な関係を持つことが予想される理由はありません。 –

+0

@DanielWagner:一般的なケースでは、これを期待するべきではないことを認識しています(例えば、 'Data.Text'がutf8を内部Unicode表現として使用した場合など)。しかし、現在のバージョンの' Data.Text'ライブラリはUTF16表現を使用しています。latin1からの変換は、実際には、各ラテン1オクテットの後に(UTF16LEかUTF16BEが必要かに応じて)ゼロオクテットを挿入するという些細な変換です。 – hvr

答えて

13

答えは、右のリンクされたページの上部にある:

text-icuパッケージを使用して、エンコーディングのはるかに大きな家族にアクセスするには:http://hackage.haskell.org/package/text-icu

迅速GHCiの例:あなたが指摘したように

λ> import Data.Text.ICU.Convert 
λ> conv <- open "ISO-8859-1" Nothing 
λ> Data.Text.IO.putStrLn $ toUnicode conv $ Data.ByteString.pack [198, 216, 197] 
ÆØÅ 
λ> Data.ByteString.unpack $ fromUnicode conv $ Data.Text.pack "ÆØÅ" 
[198,216,197] 

しかし、ラテン-1の特定の場合には、コードポイントは、Unicodeと一致し、あなたはあなたがしてData.Textから対応するpack/unpackを使用してTextに変換することができた、Stringへ/からのLatin-1から些細なマッピングを実行するData.ByteString.Char8からpack/unpackを使用することができます。

+2

は 'ByteString'から' Text'に変換するための現在のオプションに満足していませんでした。私は最終的に最適に近い性能を発揮し、そのAPIに 'IO'モナドを公開しない直接変換をコード化しました。https:// github .com/bos/text/pull/18 – hvr

関連する問題