2011-09-25 78 views
5

由於latin-1(又名ISO-8859-1)字符集嵌入在Unicode字符集中作爲其最低的256個代碼點,所以我期望轉換是微不足道的,但我在Data.Text.Encoding中沒有看到任何拉丁-1編碼轉換函數,其中只包含通用UTF編碼的轉換函數。在Latin1編碼的Data.ByteString和Data.Text之間進行轉換

什麼是推薦和/或有效的方式來轉換Data.ByteString值拉丁-1表示和Data.Text值編碼?

+1

順便說一下,假設「自拉丁字母集1嵌入Unicode字符集作爲其最低的256個代碼點,我希望轉換是微不足道的」是不合理的。沒有理由期望在兩種不同的編碼中編碼單個碼流所產生的字節流應該彼此之間存在微不足道的關係。 –

+0

@DanielWagner:是的,我知道在一般情況下,我不應該期待這個(例如,如果'Data.Text'使用utf8作爲它的內部Unicode表示形式),但是當前版本的'Data.Text'庫使用UTF16表示,對此,latin1的轉換實際上是一個簡單的轉換,包括在每個latin1八位字節之後或之前插入零八位字節(取決於是否需要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] 

然而,正如你指出的那樣,在latin-1的特定情況下,代碼點與Unicode一致,因此可以使用pack/unpackData.ByteString.Char8從/執行從Latin-1的瑣碎映射到String,您可以然後使用相應的pack/unpack轉換爲TextData.Text

+2

不滿意從'ByteString'轉換爲'Text'的當前選項我終於編寫了一個直接轉換,它執行接近最優化並且不會在其API中公開'IO' monad,請參閱https:// github .COM/BOS /文字/拉/ 18 – hvr

相關問題