2010-01-01 12 views
13

ऐसा लगता है कि वाईएएमएल लाइब्रेरी जो रूबी 1.9 के साथ जहाजों को एन्कोडिंग-बहरा है।रुबी 1.9, वाईएएमएल, और स्ट्रिंग एन्कोडिंग्स: सैनिटी के जीवन का नेतृत्व कैसे करें?

इसका क्या अर्थ है कि वाईएएमएल उत्पन्न करते समय, यह बाइट्स की कोई स्ट्रिंग लेगा, और किसी भी बाइट अनुक्रम से बच जाएगा जो ASCII को साफ़ नहीं करता है। वह लंगड़ा है, लेकिन स्वीकार्य है।

मेरी समस्या दूसरी तरफ है। YAML डंप से सामग्री लोड करते समय।

उदाहरण के बाद मैं एक यूटीएफ -8 स्ट्रिंग बनाता हूं, इसे डंप करें, इसे !binary प्रकार के साथ डंप किया गया है। जब मैं इसे वापस लोड करता हूं, तो इसमें एन्कोडिंग ASCII-8BIT है। उदाहरण के अंत में मैं मूल और पुनः लोड की गई स्ट्रिंग दोनों को एक और यूटीएफ -8 स्ट्रिंग के साथ जोड़ना चाहता हूं। उत्तरार्द्ध Encoding::CompatibilityError के साथ विफल हो जाएगा।

require 'yaml' 
s0 = "Iñtërnâtiônàlizætiøn" 
y = s0.to_yaml 
s1 = YAML::load y 
puts s0     # => Iñtërnâtiônàlizætiøn 
puts s0.encoding  # => UTF-8 
puts s1     # => Iñtërnâtiônàlizætiøn 
puts s1.encoding  # => ASCII-8BIT 
puts y     # => --- !binary | 
         # ScOxdMOrcm7DonRpw7Ruw6BsaXrDpnRpw7hu 
puts "ñårƒ" + s0  # => ñårƒIñtërnâtiônàlizætiøn 
puts "ñårƒ" + s1  # => Encoding::CompatibilityError: incompatible character encodings: UTF-8 and ASCII-8BIT 

मुझे लगता है कि यह स्पष्ट है कि यह कैसे जल्दी से मुसीबत को बढ़ावा मिलेगा जब आप नेस्टेड हैश और पत्ती तार के साथ सरणियों युक्त कुछ YAML स्रोत के साथ काम कर रहे हैं।

वर्तमान में मेरे पास कुछ कोड है जो सभी हैंश और सरणी को पार करता है और प्रत्येक स्ट्रिंग पर force_encoding पर कॉल करता है। वह, कम से कम कहने के लिए, भद्दा है।

क्या मैं अभी के लिए देख रहा हूँ एक तरह से YAML::load बताने के लिए कि कोई भी स्ट्रिंग है कि में आता है के रूप में व्यवहार किया जाना चाहिए, और इसलिए अपनी एन्कोडिंग UTF-8 के लिए सेट किया है।


आदर्श रूप से, रूबी के वाईएएमएल को केवल तारों को एनोटोड करना चाहिए जो उचित एन्कोडिंग के साथ डंप करता है। एक Ya2YAML प्रोजेक्ट है जो यूटीएफ -8 सुरक्षित वाईएएमएल को डंप करने का प्रयास करता है। मुझे यकीन नहीं है कि यह कितना दूर है। अगर किसी ने इसके साथ खेला है, तो मैं किसी भी विचार का स्वागत करता हूं।

इसके बावजूद, मुझे अभी भी इन डंपों को बिना किसी एन्कोडिंग जानकारी के निपटारे के हैं। हालांकि मुझे पता है कि वे सभी यूटीएफ -8 हैं।

+2

भारी धातु umlauts के लिए +1। –

+0

मैं बस एक ही बग/व्यवहार में चलाता हूं ... क्या आपको एक और समाधान मिला है या क्या आप अभी भी प्रत्येक स्ट्रिंग पर YAML.load और फिर force_encoding ('utf-8') कर रहे हैं? – severin

उत्तर

1

सबसे पहले जिस पाठफाइल को आप पढ़ने का प्रयास कर रहे हैं वह यूटीएफ -8 एन्कोडेड होना चाहिए (यह आपकी वाईएएमएल फ़ाइल होनी चाहिए)।

फिर अपने माणिक फ़ाइल, हैश के शीर्ष करने के लिए इस लाइन को जोड़ने और सभी

# encoding: UTF-8 

इसका मतलब यह होगा कि सभी स्ट्रिंग्स के लिए डिफ़ॉल्ट एन्कोडिंग UTF-8 हो जाएगा, और इसका मतलब यह होना चाहिए कि किसी भी पाठ आप डंप YAML.dump ('text') या यहां तक ​​कि स्ट्रिंग अक्षर 'जैसे' को भी यूटीएफ -8 को एन्कोड किया जाना चाहिए, और सभी को यहां से अच्छी तरह से काम करना चाहिए।

+0

कोई फर्क नहीं पड़ता। सामग्री को यथासंभव स्पष्ट और सौहार्दपूर्ण कारणों से, एएससीआईआई -8 बीआईटी के रूप में समाप्त होने से बाइनरी के रूप में पढ़ा जाता है, लेकिन इसलिए yaml को अनचाहे यूटीएफ 8 तारों को ठीक से डंप करना चाहिए। मुझे इसके बारे में कोई समाधान नहीं है लेकिन इसमें एक अच्छा हिस्सा कोड शामिल है। जब मैं एक मणि तैयार करता हूं तो मैं एक उत्तर पोस्ट करूंगा। – kch

3

अपने रूबी को नवीनतम 1.9.2 में अपग्रेड करने पर विचार करें। ।

मुझे उस बग को 1.9.1 में मिला लेकिन 1.9.2 नहीं मिला।

2
YAML::ENGINE.yamler='psych' 
'Résumé'.to_yaml # => "--- Résumé\n...\n" 
0

एवगेनी का जवाब अभी भी मेरे लिए द्विआधारी से पता चलता है, लेकिन यह काम करता है ('syck' 'साइक' की instoad):

YAML::ENGINE.yamler='syck' 
'Résumé'.to_yaml # => "--- "R\xE9sum\xE9" 

मैं रूबी 1.9 का उपयोग कर रहा हूँ। विशेष रूप से बचने के मेरे उद्देश्यों के लिए नोट ठीक है - मुझे इसे दिखाने के लिए बस जरूरी नहीं है! बाइनरी ... सामान्य शब्दों के लिए। भगवान का शुक्र है .to_yaml मेरे लिए फिर से कार्यात्मक है - हर समय इसका उपयोग करने के लिए प्रयोग किया जाता है। वास्तव में स्वच्छता का जीवन कैसे लोड करें :)

+0

उस फिक्स उपयोगकर्ता के लिए धन्यवाद 1262147 - yamler = 'psych' ने मेरे लिए कुछ नहीं किया, लेकिन yamler = 'syck' ने इसे ठीक किया। पहले to_yaml सबकुछ डंप कर रहा था! बाइनरी = जो कुछ भी - एक ActiveRecord से विशेषताएँ जो यूटीएफ 8 mysql तालिका से आया था। –

+0

उत्तर पुराना है, इसे बनाया जाने पर पुराना हो गया था, सिंक अप्रचलित है – bbozo

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