/ / परिवर्तित gsub () रूबी 1.8 से 2.0 पैटर्न - रूबी, रेगेक्स, यूनिकोड, gsub

रूबी 1.8 से 2.0 तक gsub () पैटर्न को परिवर्तित करना - रूबी, रेगेक्स, यूनिकोड, जीएसबी

मेरे पास एक रूबी प्रोग्राम है जिसे मैं रूबी 1.8 को रूबी 2.0.0-पी 247 में अपग्रेड करने की कोशिश कर रहा हूं।

यह 1.8.7 में ठीक काम करता है:

 begin
ARGF.each do |line|
# a collection of pecluliarlities, appended as they appear in data
line.gsub!("x92", """)
line.gsub!("x96", "-")
puts line
end
rescue => e
$stderr << "exception on line #{$.}:n"
$stderr << "#{e.message}:n"
$stderr << @line
end

लेकिन रूबी 2.0 के तहत, 96 या 92 का एनकाउंटर करते समय यह एक एक्सकेशन होता है, जिसमें डेटा फ़ाइल शामिल होती है, अन्यथा इसमें ASCII प्रतीत होता है:

 invalid byte sequence in utf-8

मैंने सभी तरह की कोशिश की है: डबल बैकस्लैश, स्ट्रिंग, बल_केनोडिंग (), आदि के बजाय रेगेक्स ऑब्जेक्ट का उपयोग करके और स्टम्प्ड हूं।

क्या कोई मेरे लिए लापता पहेली टुकड़े को भर सकता है?

धन्यवाद।

=============== परिवर्धन: 2013-09-25 ============

X92 को u2019 में बदलने से समस्या ठीक नहीं हुई।

कार्यक्रम तब तक त्रुटि नहीं करता है जब तक कि यह वास्तव में हिट न होइनपुट फ़ाइल में एक 92 या 96, इसलिए मैं उलझन में हूं कि स्ट्रिंग में वर्ण पैटर्न कैसे समस्या है जब इनपुट डेटा की सैकड़ों हजारों लाइनें हैं जो बिना घटना के पैटर्न के खिलाफ मेल खाते हैं।

उत्तर:

जवाब के लिए 2 № 1

यह रेग्क्स नहीं है कि अपवाद को फेंक रहा है, यह रूबी संकलक है। x92 तथा x96 आप कैसे प्रतिनिधित्व करेंगे तथा विंडोज़ 1252 एन्कोडिंग में, लेकिन रूबी स्ट्रिंग को utf-8 एन्कोडेड होने की उम्मीद करती है। आपको कच्चे बाइट जैसे मूल्यों को रखने की आदत से बाहर निकलने की आवश्यकता है x92 अपने स्ट्रिंग शाब्दिक में। गैर-एएससीआईआई पात्रों को यूनिकोड एस्केप सीक्वेंस द्वारा निर्दिष्ट किया जाना चाहिए (इस मामले में, u2019 तथा u2013)।

अब यह एक यूनिकोड की दुनिया है, बाइट के संदर्भ में पाठ के बारे में सोचना बंद करें और इसके बजाय पात्रों के संदर्भ में सोचें।