2011-09-25 8 views
5

Latin-1 (aka ISO-8859-1) karakter kümesi, en düşük 256 kod noktası olarak ayarlanan Unicode karakter kümesine gömülü olduğundan dönüşüm önemsiz, ama ben sadece ortak UTF kodlamaları için dönüşüm işlevleri içeren Data.Text.Encoding içinde herhangi bir latin-1 kodlama dönüşüm işlevleri görmedim.Latin1 kodlu DataByteString ve Data.Text Arasındaki Dönüştürme

Latin-1 gösterimi ve Data.Text değerleri kodlanmış Data.ByteString değerleri arasında dönüştürmek için önerilen ve/veya verimli yolu nedir?

+1

, "latin 1 karakter kümesi en düşük 256 kod noktaları olarak belirlenen Unicode karakter gömülü olduğundan, dönüşüm önemsiz olmasını beklersiniz" varsayımı yersizdir. İki farklı kodlamada tek bir kod noktası akışını kodlayan sonuç testlerinin birbiriyle çok küçük bir ilişkiye sahip olmasını beklemek için bir neden yoktur. –

+0

@DanielWagner: Evet, genel durumda bunu beklememeliyim (örneğin, Data.Text, utf8 iç Unicode temsili olarak kullanılıyorsa), ancak Data.Text'in güncel sürümü. kütüphane, UTF16 gösterimini kullanır; buradaki latin1'den dönüştürme, aslında, sıfır oktetlerin sonra veya daha önce eklenmesinden (UTF16LE veya UTF16BE'nin gerekip gerekmediğine bağlı olarak) her latin1 oktetinden oluşan önemsiz bir dönüşümdür. – hvr

cevap

13

cevap hakkı size bağlı sayfanın üst kısmında yer alır: http://hackage.haskell.org/package/text-icu

Hızlı bir GHCi örnek:

kodlamaların çok daha büyük bir ailenin erişmek için, text-icu paketi kullanmak : Eğer belirttiği gibi

λ> 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] 

Ancak, latin-1'in özgül durumda, kod noktaları Unicode denk, Böylece daha sonra Data.Text karşılık gelen pack/unpack kullanılarak Text dönüşebilen hangi String/noktasından latin 1'den önemsiz haritlama Data.ByteString.Char8 den pack/unpack kullanabilirsiniz. Bu arada

+2

, "ByteString" i "Text" e çevirmek için mevcut seçeneklerden memnun kalmamadım. Son olarak, neredeyse optimal performans gösteren ve API'daki "IO" monadını göstermeyen doğrudan bir dönüşüm kodladım, bkz. Https: // github .com/bos/metin/çekme/18 – hvr