2012-03-03 22 views
12

मैं थोर का उपयोग कर रहा हूं और एक फ़ाइल में वाईएएमएल आउटपुट करने की कोशिश कर रहा हूं। आईआरबी में मुझे उम्मीद है कि मैं क्या उम्मीद करता हूं। वाईएएमएल प्रारूप में सादा पाठ। लेकिन जब थोर में एक विधि का हिस्सा होता है, तो इसका उत्पादन अलग होता है ...थोर और वाईएएमएल बाइनरी के रूप में outputting?

class Foo < Thor 
    include Thor::Actions 

    desc "bar", "test" 
    def set 
    test = {"name" => "Xavier", "age" => 30} 
    puts test 
    # {"name"=>"Xavier", "age"=>30} 
    puts test.to_yaml 
    # !binary "bmFtZQ==": !binary |- 
    # WGF2aWVy 
    # !binary "YWdl": 30 
    File.open("data/config.yml", "w") {|f| f.write(test.to_yaml) } 
    end 
end 

कोई विचार?

+1

मैं सिर्फ अपने उदाहरण भाग गया और यह मुझे बिल्कुल ठीक उत्पादन दे दी है। मैं thor 0.14.6 भाग गया। – Maran

+0

चेक करने के लिए समय निकालने के लिए धन्यवाद। मैं इस बिंदु पर क्या करना है इसके नुकसान में हूं। मैं रूबी 1.9.3 पी 125 का उपयोग कर रहा हूं अगर इससे कोई फर्क पड़ता है। :) – cp3

+1

मैंने 1.9 इंस्टॉल किया।3 और इसे फिर से चलाया, और वास्तव में बाइनरी आउटपुट। मैंने देखा कि इंस्टॉल के दौरान वाईएएमएल को अपग्रेड किया गया है। यह शायद उस अपग्रेड किए गए संस्करण के साथ कुछ करने के लिए है। – Maran

उत्तर

14

सभी रूबी 1.9 तारों से उनके साथ एक एन्कोडिंग संलग्न है।

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

बाइनरी एन्कोडिंग से बचने के लिए, सुनिश्चित करें कि to_yaml को कॉल करने से पहले आपके सभी स्ट्रिंग एन्कोडिंग यूटीएफ -8 हैं। Force_encoding ("UTF-8") विधि के साथ एन्कोडिंग बदलें।

options = { 
    :port => 26000, 
    :rackup => File.expand_path(File.join(File.dirname(__FILE__), "../sveg.rb")) 
} 
utf8_options = {} 
options.each_pair { |k,v| utf8_options[k] = ((v.is_a? String) ? v.force_encoding("UTF-8") : v)} 
puts utf8_options.to_yaml 

यहाँ के रूप में द्विआधारी

>> x = "test" 
=> "test" 
>> x.encoding 
=> #<Encoding:UTF-8> 
>> x.to_yaml 
=> "--- test\n...\n" 
>> x.force_encoding "ASCII-8BIT" 
=> "test" 
>> x.to_yaml 
=> "--- !binary |-\n dGVzdA==\n" 
7

YAML एन्कोडिंग सरल तार का एक उदाहरण संस्करण 1.9.3p125, माणिक के बाद है:

उदाहरण के लिए, यह मैं कैसे सांकेतिक शब्दों में बदलना मेरे विकल्प YAML में हैश है बिल्ड-इन वाईएएमएल इंजन पहले से पहले सभी बिनरी एन्कोडिंग का इलाज करेगा। आपको बस अपनी स्ट्रिंग.to_yaml से पहले सही गैर-बिनरी एन्कोडिंग सेट करना है।

रूबी 1.9 में, सभी स्ट्रिंग वस्तु एक एन्कोडिंग वस्तु संलग्न किया है और के रूप में ब्लॉग (जेम्स एडवर्ड ग्रे द्वितीय द्वारा) निम्नलिखित उल्लेख किया है, माणिक जब स्ट्रिंग उत्पन्न होता है एन्कोडिंग के तीन प्रकार में निर्माण किया है: http://blog.grayproductions.net/articles/ruby_19s_three_default_encodings

एन्कोडिंग में से एक आपकी समस्या का समाधान हो सकता है => स्रोत कोड एन्कोडिंग

यह अपने स्रोत कोड की एन्कोडिंग है, और पहली पंक्ति या दूसरी पंक्ति में जादू एन्कोडिंग स्ट्रिंग जोड़ने (यदि आप एक है द्वारा निर्दिष्ट किया जा सकता है SHA-धमाके के अपने स्रोत कोड की पहली पंक्ति में स्ट्रिंग) जादू एन्कोडिंग कोड निम्न में से एक हो सकता है:

  • # एन्कोडिंग: utf-8
  • # कोडिंग: utf-8
  • # - - एन्कोडिंग: utf-8 - -

तो आपके मामले में, यदि आप गहरे लाल रंग का 1.9.3p125 या बाद में उपयोग करते हैं, यह अपने कोड की शुरुआत में जादू एन्कोडिंग में से एक जोड़कर हल किया जाना चाहिए।

# encoding: utf-8 
require 'thor' 
class Foo < Thor 
    include Thor::Actions 

    desc "bar", "test" 
    def bar 
    test = {"name" => "Xavier", "age" => 30} 
    puts test 
    #{"name"=>"Xavier", "age"=>30} 
    puts test["name"].encoding.name 
    #UTF-8 
    puts test.to_yaml 
    #--- 
    #name: Xavier 
    #age: 30 
    puts test.to_yaml.encoding.name 
    #UTF-8 
    end 
end 
0

मैं इस 1.9.3p545 विंडोज पर उपयोग करने के साथ संघर्ष कर रहा है - और कोई थोर - बस स्ट्रिंग से युक्त एक सरल हैश के साथ।

मणि ZAML समस्या का हल काफी बस:

require 'ZAML' 
yaml = ZAML.dump(some_hash) 
File.write(path_to_yaml_file, yaml)