2011-09-25 13 views
5

चूंकि लैटिन -1 (उर्फ आईएसओ -885 9 -1) वर्ण सेट यूनिकोड चरित्र सेट में सबसे कम 256 कोड-पॉइंट के रूप में सेट किया गया है, तो मुझे उम्मीद है कि रूपांतरण छोटा हो गया, लेकिन मुझे Data.Text.Encoding में कोई लैटिन -1 एन्कोडिंग रूपांतरण फ़ंक्शन नहीं मिला, जिसमें सामान्य यूटीएफ एन्कोडिंग के लिए केवल रूपांतरण फ़ंक्शन शामिल हैं।लैटिन 1-एन्कोडेड डेटा के बीच कनवर्ट करें। बाइटस्ट्रिंग और डेटा। टेक्स्ट

लैटिन -1 प्रतिनिधित्व और Data.Text मानों में एन्कोड किए गए मान Data.ByteString मानों के बीच कनवर्ट करने के लिए अनुशंसित और/या कुशल तरीका क्या है?

+1

वैसे, यह धारणा है कि "चूंकि लैटिन -1 वर्ण सेट यूनिकोड चरित्र में सबसे कम 256 कोड-पॉइंट के रूप में सेट किया गया है, इसलिए मैं रूपांतरण को छोटा होने की उम्मीद करता हूं" अनचाहे है। उम्मीद करने का कोई कारण नहीं है कि दो अलग-अलग एन्कोडिंग में एक कोडपॉइंट स्ट्रीम एन्कोडिंग के परिणामस्वरूप बाइटस्ट्रीम एक-दूसरे के साथ एक छोटा सा संबंध होना चाहिए। –

+0

@DanielWagner: हाँ, मुझे पता है कि सामान्य मामले में मुझे इसकी उम्मीद नहीं करनी चाहिए (उदाहरण के लिए यदि 'Data.Text' ने यूटीएफ 8 को अपने आंतरिक यूनिकोड प्रतिनिधित्व के रूप में उपयोग किया), लेकिन' Data.Text' का वर्तमान संस्करण पुस्तकालय यूटीएफ 16 प्रतिनिधित्व का उपयोग करता है, जिसके लिए लैटिन 1 का रूपांतरण वास्तव में एक छोटा रूपांतरण है जिसमें शून्य या ऑक्टेट्स डालने में शामिल होता है (प्रत्येक यूटीएफ 16LE या यूटीएफ 16 बीई की आवश्यकता होती है) प्रत्येक लैटिन 1 ऑक्टेट। – hvr

उत्तर

13

जवाब सही पेज आप लिंक के शीर्ष पर है: http://hackage.haskell.org/package/text-icu

एक त्वरित GHCi उदाहरण:

एन्कोडिंग का एक बहुत बड़ा परिवार में पहुँच प्राप्त करने के लिए, text-icu पैकेज का उपयोग :

λ> 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 के विशिष्ट मामले में, कोड अंक यूनिकोड के साथ मेल खाना, ताकि आप Data.ByteString.Char8 से pack/unpack का उपयोग String से/से लैटिन -1 तुच्छ मानचित्रण प्रदर्शन करने के लिए है, जो आप तो Data.Text से इसी pack/unpack का उपयोग कर Text में बदल सकते हैं कर सकते हैं।

+2

'बाइटस्ट्रिंग' से' टेक्स्ट' में कनवर्ट करने के मौजूदा विकल्पों से संतुष्ट नहीं होने के कारण मैंने अंततः एक प्रत्यक्ष रूपांतरण को कोड किया जो निकटतम इष्टतम प्रदर्शन करता है और अपने एपीआई में 'आईओ' मोनैड का खुलासा नहीं करता है, https: // github देखें .com/बोस/पाठ/खींच/18 – hvr

संबंधित मुद्दे