ऐसा लगता है कि वाईएएमएल लाइब्रेरी जो रूबी 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 हैं।
भारी धातु umlauts के लिए +1। –
मैं बस एक ही बग/व्यवहार में चलाता हूं ... क्या आपको एक और समाधान मिला है या क्या आप अभी भी प्रत्येक स्ट्रिंग पर YAML.load और फिर force_encoding ('utf-8') कर रहे हैं? – severin