2015-06-23 9 views
6

में \ r \ r \ n में अनुवाद किया गया है मैं विंडोज 7 64-बिट पर हूं। r n Haskell

मेरे प्रोग्राम को बाहरी स्रोत से कुछ पाठ (Utf8 एन्कोडेड) पुनर्प्राप्त करने की आवश्यकता है, इसके साथ कुछ चीज़ें करें, फिर इसे डिस्क पर सहेजें। मूल पाठ न्यूलाइन का प्रतिनिधित्व करने के लिए "\ r \ n" अनुक्रम का उपयोग कर रहा है (मुझे इसे इस तरह से रखने में खुशी है)।

मुद्दा: Data.Text.writeFile प्रत्येक का उपयोग करते समय "\ r \ n" अनुक्रम के रूप में "\ r \ r \ n" अनुवाद किया जा रहा है, कि हर '\ n' के लिए अनुवाद किया है कि "\ आर \ n ", जब भी यह मूल पाठ में पहले से ही '\ r' से पहले है। मैं समझता हूं कि, जब Windows OS पर किसी फ़ाइल को लिखते हैं, '\ n' का अनुवाद "\ r \ n" में किया जाना चाहिए, जब पहले से '\ r' से पहले नहीं है, लेकिन "\ r \ n" का अनुवाद "\ r \ r \ n" सही प्रतीत नहीं होता है।

का उपयोग कर ByteString.writeLine पाठ की encodeUtf8 संस्करण के लिए लागू किया काम करता है अच्छी तरह से हालांकि (बिना किसी अतिरिक्त "\ r" एक "\ r \ n" अनुक्रम के अंदर डाला)

एक साधारण उदाहरण:

{-# LANGUAGE OverloadedStrings #-} 
import qualified Data.ByteString as B 
import qualified Data.Text as T 
import qualified Data.Text.IO as T (writeFile) 
import qualified Data.Text.Encoding as T (encodeUtf8) 

str = "Line 1 is here\r\nLine 2 is here\r\nLine 3 is here" :: T.Text 

main = do 
    B.writeFile "byt.bin" $ T.encodeUtf8 str 
    T.writeFile "txt.bin" str 

हेक्स संपादक के साथ इस कोड द्वारा उत्पादित प्रत्येक फ़ाइल को देखते हुए, कोई टी.writeFile लाइन के माध्यम से उत्पादित फ़ाइल में प्रत्येक x0A के सामने अतिरिक्त x0D जोड़ा जा सकता है।

B.writeFile: enter image description here

T.writeFile: enter image description here

मेरा प्रश्न: मैं गलत क्या किया? क्या Windows पर T.writeFile का उपयोग करने का कोई तरीका है, और "\ r \ n" "\ r \ r \ n" में अनुवाद नहीं किया गया है?

+0

आप फ़ाइल को यूनिक्स-शैली '\ n "' -ऑनली में _load_ क्यों नहीं करते? यह निश्चित रूप से आपके कार्यक्रम के भीतर चीजों को आसान बना देगा, और आउटपुट \ "\ r \ n" 'के साथ भी बाहर आ जाएगा। – leftaroundabout

+0

@ बाएंअराउंडबाउट: मैंने पूरी कहानी नहीं बताया, लेकिन मूल पाठ बेस 64 प्रारूप में फ़ाइल में स्थित है। मुझे पहले फ़ाइल से बाइट्सट्रिंग्स को पढ़ने की जरूरत है, उन्हें डीकोड करें (डेटा.बेटस्ट्रिंग.बेस 64 का उपयोग करके), फिर उन्हें टेक्स्ट में बदलें (और मैं इसे हेरफेर करना शुरू कर सकता हूं)। उस चरण में मैं सभी "\ r \ n" से "\ n" को प्रतिस्थापित कर सकता हूं। क्या आप यही सुझाव देते हैं? – Janthelme

+0

मैं वास्तव में ऐसा सुझाव दूंगा। यदि आपके प्रोग्राम में तारों में विंडोज-स्टाइल लाइन अंतराल है तो यह सभी प्रकार की अन्य परेशानी का कारण बन सकता है। – leftaroundabout

उत्तर

10

आपका जवाब the docs में है:

GHC 6.12, पाठ के साथ शुरू आई/ओ प्रणाली का उपयोग किया जाता है या की संभाल वर्तमान स्थान और लाइन को समाप्त हुए सम्मेलनों।

यह देखते हुए कि आप स्वयं को हैंडल नहीं खोलते हैं, ऐसा लगता है कि पुस्तकालय टेक्स्ट मोड में फ़ाइल खोलता है, जिससे ऑपरेटिंग सिस्टम द्वारा एंडलाइन वर्णों का अनुवाद होता है। इसके बजाय आप openBinaryFile का उपयोग कर बाइनरी मोड में फ़ाइल खोल सकते हैं और फिर इसे रोकने के लिए Data.Text.hPutStr का उपयोग करें।

हालांकि, आपके एन्कोडिंग को संभालने वाला ओएस भी वही नहीं हो सकता है जो आप चाहते हैं। आपके परिदृश्य के आधार पर, ByteString एस का उपयोग करके स्ट्रिंग को एन्कोडिंग/डीकोडिंग स्पष्ट रूप से बेहतर विचार हो सकता है।

+1

धन्यवाद। मैं पुष्टि करता हूं कि समाधान openBinaryFile और hPutStr काम करता है। – Janthelme

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