2012-05-05 16 views
7

"UTF-8 में अवैध बाइट क्रम" आईआरबी में, मैं कोशिश कर रहा हूँ निम्नलिखित:रूबी String.encode अभी भी देता है

1.9.3p194 :001 > foo = "\xBF".encode("utf-8", :invalid => :replace, :undef => :replace) 
=> "\xBF" 
1.9.3p194 :002 > foo.match /foo/ 
ArgumentError: invalid byte sequence in UTF-8 
from (irb):2:in `match' 

कोई भी विचार गलत क्या हो रहा है?

उत्तर

21

मुझे लगता है कि चाहते हैं "\xBF" पहले से ही मानना ​​है कि यह में एन्कोड किया गया है UTF-8 इसलिए जब आप encode कहते हैं, इसे लगता है कि UTF-8 में एक UTF-8 स्ट्रिंग एन्कोड करने के लिए कोशिश कर रहे हैं और कुछ नहीं करता है:

>> s = "\xBF" 
=> "\xBF" 
>> s.encoding 
=> #<Encoding:UTF-8> 

\xBF वैध यूटीएफ -8 मान्य नहीं है, इसलिए यह निश्चित रूप से बकवास है। लेकिन अगर आप encode के तीन तर्क फार्म का उपयोग करें: str →

एनकोड (dst_encoding, src_encoding [, विकल्प])

[...] दूसरा रूप से ट्रांसकोड str की एक प्रति रिटर्न src_encoding से dst_encoding

>> foo = s.encode('utf-8', 'binary', :invalid => :replace, :undef => :replace) 
=> "�" 

s कहाँ "\xBF" कि सोचता है कि यह से UTF-8 है:

आप क्या स्ट्रिंग सोचता है कि इसकी एन्कोडिंग है ध्यान न दें और बाइनरी डेटा के रूप में यह इलाज के लिए encode बताकर मुद्दा मजबूर कर सकते हैं ऊपर।

तुम भी force_encodings पर उपयोग यह द्विआधारी होने के लिए मजबूर करने के लिए कर सकता है और उसके बाद दो तर्क encode का उपयोग करें:

>> s.encoding 
=> #<Encoding:UTF-8> 
>> s.force_encoding('binary') 
=> "\xBF" 
>> s.encoding 
=> #<Encoding:ASCII-8BIT> 
>> foo = s.encode('utf-8', :invalid => :replace, :undef => :replace) 
=> "�" 
+0

धन्यवाद है रहता है! से-एन्कोडिंग के रूप में 'ascii' का उपयोग करना भी काम करता है। – drewinglis

+1

@ ड्रूविंग्लिस: मुझे "बाइनरी" (जो "एसीआईआई -8 बिट" के लिए उपनाम है) की व्याख्या पसंद है, "ascii" बिल्कुल वही नहीं है। –

2

यदि आप एक स्पष्ट कोड पृष्ठ का उपयोग करके स्रोत पाठ फ़ाइल को पढ़ने यह तय हो गई है:

File.open('thefile.txt', 'r:iso8859-1') 
2

आप केवल ASCII वर्ण के साथ काम कर रहे हैं तो आप उपयोग कर सकते हैं

>> "Hello \xBF World!".encode('utf-8', 'binary', :invalid => :replace, :undef => :replace) 
=> "Hello � World!" 

लेकिन अगर हम वैध UTF8 वर्ण कि ascii

>> "¡Hace \xBF mucho frío!".encode('utf-8', 'binary', :invalid => :replace, :undef => :replace) 
=> "��Hace � mucho fr��o!" 

उह ओह में अमान्य हैं के साथ एक ही दृष्टिकोण का उपयोग क्या होता है! हम उच्चारण के साथ रहने के लिए चाहते हैं। यहाँ एक विकल्प है कि वैध UTF8 वर्ण

>> "¡Hace \xBF mucho frío!".chars.select{|i| i.valid_encoding?}.join 
=> "¡Hace mucho frío!" 

इसके अलावा रूबी 2.1 में वहाँ एक नई विधि scrub कहा जाता है कि इस समस्या का हल

>> "¡Hace \xBF mucho frío!".scrub 
=> "¡Hace � mucho frío!" 
>> "¡Hace \xBF mucho frío!".scrub('') 
=> "¡Hace mucho frío!" 
संबंधित मुद्दे