2010-01-18 11 views
24

आउटपुट करने के लिए हास्केल का उपयोग करना मैं कंसोल में यूटीएफ -8-एन्कोडेड डेटा को आउटपुट करने की कोशिश कर रहा हूं।एक यूटीएफ -8-एन्कोडेड बाइटस्ट्रिंग

मैंने String का उपयोग करके इसे पूरा करने में कामयाब रहा है, लेकिन अब मैं ByteString के साथ ऐसा करना चाहता हूं। क्या ऐसा करने का एक अच्छा और तेज़ तरीका है?

यह मैं अब तक क्या मिल गया है, और यह काम नहीं कर रहा:

import Prelude hiding (putStr) 
import Data.ByteString.Char8 (putStr, pack) 

main :: IO() 
main = putStr $ pack "čušpajž日本語" 

यह uapaj~�,� बाहर प्रिंट, ओह।

मुझे नवीनतम जीएचसी 6.12.1 सर्वोत्तम के लिए उत्तर चाहिए, हालांकि मैं पिछले संस्करणों के उत्तर भी सुनना चाहता हूं।

धन्यवाद!

अद्यतन: पाठ की एक ही यूटीएफ -8-एन्कोडेड लाइन को पढ़ना और आउटपुट करना ठीक से काम करता है। (Data.ByteString.Char8 का उपयोग करके, मैं बस putStr =<< getLine करता हूं।) लेकिन उपरोक्त उदाहरण में, .hs फ़ाइल के अंदर से पैक किए गए मान, ठीक से आउटपुट करने से इनकार करते हैं ... मुझे कुछ गलत करना होगा?

+0

आप किस मंच पर हैं? यूनिक्स-जैसे प्लेटफार्मों पर यूनिकोड अब काफी अच्छा काम करता है; विंडोज़ समर्थन थोड़ा सा है। System.IO के लिए प्रलेखन देखें: "(जीएचसी नोट: विंडोज़ पर, हम वर्तमान में डबल-बाइट एन्कोडिंग का समर्थन नहीं करते हैं; यदि कंसोल का कोड पेज असमर्थित है, तो लोकेल एन्कोडिंग लैटिन 1 होगी।)" – ephemient

+0

64-बिट लिनक्स। 'System.IO' केवल 'स्ट्रिंग' के साथ काम नहीं करता है? –

+1

आपको 'बीएस। चाहर 8' का उपयोग नहीं करना चाहिए, क्योंकि वह 8-बिट एन्कोडिंग मानता है और बहु-बाइट यूनिकोड वर्णों को छोटा करता है। सामान्य बाइटस्ट्रिंग का प्रयोग करें जबतक कि आप बिल्कुल * जानते हैं कि 'बीएस.खार 8' सही डेटा प्रकार है (जिसमें यह भी शामिल है कि सामान्य बाइटस्ट्रिंग स्पष्ट रूप से उस उपयोग के मामले के लिए सही प्रकार क्यों नहीं हैं)। – David

उत्तर

24

utf8-string bytestrings का समर्थन करता है।

import Prelude hiding (putStr) 
import Data.ByteString.Char8 (putStr) 
import Data.ByteString.UTF8 (fromString) 

main :: IO() 
main = putStr $ fromString "čušpajž日本語" 
-1
+0

Noooooooo। :(लेकिन, मैं परेशान हूं ... यह नियमित स्ट्रिंग्स के साथ ठीक काम करता प्रतीत होता है? –

+0

जो भी हो, यह अभी तय हो गया है। आपके लिंक किए गए पृष्ठ पर दिए गए उदाहरण को निष्पादित करने के लिए अपेक्षित कार्य करता है। अंतर यह है कि मैं कोशिश कर रहा हूं आउटपुट यूटीएफ -8-एन्कोडेड बाइटस्ट्रिंग्स, और यूटीएफ -8-एन्कोडेड स्ट्रिंग्स नहीं, जिन्हें अधिक कुशल माना जाता है। ध्यान रखें कि मैं वर्तमान में जीएचसी 6.12.1 का उपयोग कर रहा हूं, हालांकि मुझे पता है कि समस्या जीएचसी 6.10 में मौजूद नहीं है .4 या तो –

+3

नहीं, यह वास्तव में समस्या नहीं है। जीएचसी 6.12 utf8 * स्ट्रिंग * आईओ करता है, यदि लोकेल उस पर सेट होता है। वास्तव में उपर्युक्त बग हल करता है, जो ओपी की समस्या नहीं है। –

20

bytestrings बाइट्स के तार कर रहे हैं। जब वे आउटपुट होते हैं, तो उन्हें 8 बिट्स तक छोटा कर दिया जाएगा, क्योंकि यह Data.ByteString.Char8 के लिए प्रलेखन में वर्णन करता है। हैकेज पर utf8-string पैकेज के माध्यम से आपको उन्हें utf8 में स्पष्ट रूप से रूपांतरित करने की आवश्यकता होगी, जिसमें बाइटस्टर्स के लिए समर्थन शामिल है।


हालांकि, 2011 के रूप में, आप text पैकेज तेजी से, पैक यूनिकोड उत्पादन के लिए उपयोग करना चाहिए। GHC truncating Unicode character output

आपका उदाहरण बहुत आसान हो जाता है:

{-# LANGUAGE OverloadedStrings #-} 

import qualified Data.Text as T 
import qualified Data.Text.IO as T 

main = T.putStrLn "čušpajž日本語" 
तो जैसा

:

$ runhaskell A.hs 
čušpajž日本語 
+0

क्या utf8-स्ट्रिंग केवल स्ट्रिंग्स के साथ काम नहीं करता है, और बाइटस्ट्रिंग नहीं? –

+3

नहीं, यह अलमारी के साथ भी काम करता है। Http://stackoverflow.com/questions/2086842/using-haskell-to-output-a-utf-8-encoded-bytestring/2089195#2089195 देखें –

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