ruby रूबी ने आईएसओ-8859-1 से यूटीएफ-8 तक स्ट्रिंग एन्कोडिंग परिवर्तित नहीं किया




encoding utf-8 (2)

मैं आईएसओ -8859-1 एन्कोडिंग से यूटीएफ -8 में एक स्ट्रिंग बदलने की कोशिश कर रहा हूं, लेकिन मुझे यह काम करने के लिए प्रतीत नहीं हो सकता। यहां एक उदाहरण है कि मैंने आईआरबी में क्या किया है।

irb(main):050:0> string = 'Norrlandsvägen'
=> "Norrlandsvägen"
irb(main):051:0> string.force_encoding('iso-8859-1')
=> "Norrlandsv\xC3\xA4gen"
irb(main):052:0> string = string.encode('utf-8')
=> "Norrlandsvägen" 

मुझे यकीन नहीं है कि आईएसओ -8859-1 में नॉरल्सैंडस्वाग एनएफटी -8 में नोरलैंड्सव्यून्ग में परिवर्तित हो जाएगा।

मैंने सांकेतिक शब्दों में बदलना, सांकेतिक शब्दों में बदलना !, सांकेतिक शब्दों में बदलना (गंतव्य एन्कोडिंग, मूल इकोकोडिंग), आइकनव, बल-एन्कोडिंग, और सभी तरह के अजीब तरह के काम-आसपास के प्रयासों की कोशिश की है, लेकिन मैं कुछ भी नहीं सोचता। क्या कोई मेरी मदद कर सकता है / मुझे सही दिशा में बताता है?

रूबी नौसिखिया अब भी पागलों की तरह बाल खींच रहा है, लेकिन सभी उत्तरों के लिए आभारी लग रहा है ... :)

इस प्रश्न की पृष्ठभूमि: मैं एक मणि लिख रहा हूं जो कुछ वेबसाइटों (जो कि आईएसओ -8859-1 एन्कोडिंग होगा) से एक एक्सएमएल फ़ाइल डाउनलोड करेगा और इसे भंडारण में सहेज कर रखेगा और मैं इसे यूटीएफ -8 में पहले परिवर्तित करना चाहूंगा। लेकिन नोरलैंडस्वाग जैसे शब्द मुझे गड़बड़ते रहते हैं वास्तव में किसी भी मदद की काफी सराहना की जाएगी!

[अद्यतन]: मुझे एहसास हुआ कि इस तरह से आईआरबी कंसोल में चलने वाले परीक्षण मुझे अलग-अलग व्यवहार दे सकते हैं, इसलिए यहां मेरे वास्तविक कोड में मेरे पास क्या है:

def convert_encoding(string, originalEncoding) 
  puts "#{string.encoding}" # ASCII-8BIT
  string.encode(originalEncoding)
  puts "#{string.encoding}" # still ASCII-8BIT
  string.encode!('utf-8')
end

लेकिन अंतिम पंक्ति मुझे निम्न त्रुटि देता है:

Encoding::UndefinedConversionError - "\xC3" from ASCII-8BIT to UTF-8

@ अमदान के उत्तर के नीचे धन्यवाद, मैंने देखा कि \xC3 वास्तव में आईआरबी में \xC3 यदि आप चलाते हैं:

irb(main):001:0> string = 'ä'
=> "ä"
irb(main):002:0> string.force_encoding('iso-8859-1')
=> "\xC3\xA4"

मैंने string.encode(originalEncoding) के नतीजे पर एक नया वैरिएबल भी निर्दिष्ट करने की कोशिश की है, लेकिन मुझे एक वंडर त्रुटि भी मिली:

newString = string.encode(originalEncoding)
puts "#{newString.encoding}" # can't even get to this line...
newString.encode!('utf-8')

और त्रुटि Encoding::UndefinedConversionError - "\xC3" to UTF-8 in conversion from ASCII-8BIT to UTF-8 to ISO-8859-1

मैं अभी भी इस एन्कोडिंग गड़बड़ी में बहुत खो गया हूँ, लेकिन मैं सभी उत्तरों के लिए वास्तव में आभारी हूं और सभी ने मुझे दिया है! अनेक अनेक धन्यवाद! :)


आप यूटीएफ -8 में एक स्ट्रिंग असाइन करते हैं। इसमें ä UTF-8 ä साथ दो बाइट्स का प्रतिनिधित्व करता है।

string = 'ä'
string.encoding
# => #<Encoding:UTF-8>
string.length
# 1
string.bytes
# [195, 164]

फिर आप बाइट्स को इस तरह व्याख्या कर सकते हैं कि वे आईएसओ -8859-1 थे, वास्तव में अंतर्निहित प्रतिनिधित्व को बदलने के बिना। इसमें किसी भी अधिक शामिल नहीं है। इसमें दो अक्षर हैं, और ¤

string.force_encoding('iso-8859-1')
# => "\xC3\xA4"
string.length
# 2
string.bytes
# [195, 164]

फिर आप इसका अनुवाद UTF-8 । चूंकि यह दोबारा व्याख्या नहीं है, लेकिन अनुवाद, आप दो अक्षर रखते हैं, लेकिन अब यूटीएफ -8 में एन्कोड किया गया है:

string = string.encode('utf-8')
# => "ä" 
string.length
# 2
string.bytes
# [195, 131, 194, 164]

जो बात आपको याद आ रही है वह तथ्य यह है कि मूल रूप से आईएसओ -8859-1 स्ट्रिंग नहीं है, जैसा कि आप अपनी वेब-सेवा से करेंगे - आपके पास गपशप है सौभाग्य से, यह आपके सभी कंसोल परीक्षणों में है; यदि आप उचित इनपुट एन्कोडिंग का उपयोग करते हुए वेबसाइट की प्रतिक्रिया पढ़ते हैं, तो यह सब ठीक काम करना चाहिए।

अपने कन्सोल परीक्षा के लिए, आइए देखें कि यदि आप उचित आईएसओ -8859-1 स्ट्रिंग से शुरू करते हैं, तो यह सब काम करता है:

string = 'Norrlandsvägen'.encode('iso-8859-1')
# => "Norrlandsv\xE4gen"
string = string.encode('utf-8')
# => "Norrlandsvägen"

अपनी विशिष्ट समस्या के लिए संपादित करें , यह काम करना चाहिए:

require 'net/https'
uri = URI.parse("https://rusta.easycruit.com/intranet/careerbuilder_se/export/xml/full")
options = {
  :use_ssl => uri.scheme == 'https', 
  :verify_mode => OpenSSL::SSL::VERIFY_NONE
}
response = Net::HTTP.start(uri.host, uri.port, options) do |https|
  https.request(Net::HTTP::Get.new(uri.path))
end
body = response.body.force_encoding('ISO-8859-1').encode('UTF-8')

Force_encoding और सांकेतिक शब्दों में बदलना के बीच अंतर है पूर्व स्ट्रिंग के लिए एन्कोडिंग सेट करता है, जबकि बाद में स्ट्रिंग की सामग्री को नए एन्कोडिंग में ट्रांसकोड करता है। नतीजतन, निम्न कोड आपकी समस्या का कारण बनता है:

string = "Norrlandsvägen"
string.force_encoding('iso-8859-1')
puts string.encode('utf-8') # Norrlandsvägen

जबकि निम्न कोड वास्तव में आपकी सामग्री को सही ढंग से एन्कोड करेगा:

string = "Norrlandsvägen".encode('iso-8859-1')
string.encode!('utf-8')

यहां एक उदाहरण irb में चल रहा है:

irb(main):023:0> string = "Norrlandsvägen".encode('iso-8859-1')
=> "Norrlandsv\xE4gen"
irb(main):024:0> string.encoding
=> #<Encoding:ISO-8859-1>
irb(main):025:0> string.encode!('utf-8')
=> "Norrlandsvägen"
irb(main):026:0> string.encoding
=> #<Encoding:UTF-8>




iconv