2012-01-03 16 views
25

मान लें कि आपके पास "€foo\xA0" जैसे स्ट्रिंग है, जो यूटीएफ -8 एन्कोड किया गया है, क्या इस स्ट्रिंग से अमान्य बाइट अनुक्रमों को निकालने का कोई तरीका है? (इसलिए आपको "€foo")स्ट्रिंग से अमान्य बाइट अनुक्रमों को हटाने के लिए रूबी 1.9 में कोई तरीका है?

रूबी -88 में आप Iconv.iconv('UTF-8//IGNORE', 'UTF-8', "€foo\xA0") का उपयोग कर सकते हैं लेकिन अब इसे बहिष्कृत किया गया है। "€foo\xA0".encode('UTF-8') कुछ भी नहीं करता है, क्योंकि यह पहले से ही यूटीएफ -8 है। मैंने कोशिश की:

"€foo\xA0".force_encoding('BINARY').encode('UTF-8', :undef => :replace, :replace => '') 

जो

"foo"

पैदावार लेकिन वह भी €

उत्तर

32
"€foo\xA0".chars.select(&:valid_encoding?).join 
वैध multibyte चरित्र खो देता है
+1

यह इस स्ट्रिंग '' में \ xF1' को दूर नहीं करता "eEspa \ xF1a; अमेरिकन प्लान" ' – Dorian

+1

@Dorian, 1.9.3 आईआरबी कंसोल पर,' "eEspa \ xF1a; अमेरिकन प्लान" .chars.select {| मैं | i.valid_encoding?}। 'रिटर्न' 'eEspaa; एफबी' 'में शामिल हों ...' क्या आपको वह व्यवहार नहीं मिला है या क्या मैंने गलत समझा है? – acobster

34
"€foo\xA0".encode('UTF-16le', invalid: :replace, replace: '').encode('UTF-8') 
+0

क्या मैं पूछ सकता हूं कि "यूटीएफ -16" क्यों? – lulalala

+2

मैं इस धारणा के तहत था कि इसमें यूटीएफ -8 की तुलना में एक बड़ा चरित्र सेट है, जिसका अर्थ है कि आप कोई वैध डेटा नहीं खोले हैं। दुर्भाग्यवश निम्नलिखित काम नहीं करते हैं: '" foo \ xA0 ".encode ('यूटीएफ -8',: अमान्य =>: प्रतिस्थापित करें: प्रतिस्थापित करें => '' '' क्योंकि स्ट्रिंग पहले से ही यूटीएफ- 8, तो यह फिर से एन्कोड नहीं किया जाएगा। –

+0

एफडब्ल्यूआईडब्ल्यू, एक बड़ी फाइल पर एक परीक्षण चला रहा है, मुझे यह विधि 'valid_encoding' दृष्टिकोण की तुलना में तीव्रता के क्रम के रूप में मिली है। – jwadsack

-2
data = '' if not (data.force_encoding("UTF-8").valid_encoding?) 
+0

यह प्रश्न का उत्तर नहीं प्रदान करता है। किसी लेखक से स्पष्टीकरण की आलोचना करने या अनुरोध करने के लिए, अपनी पोस्ट के नीचे एक टिप्पणी छोड़ दें - आप हमेशा अपनी पोस्ट पर टिप्पणी कर सकते हैं, और एक बार आपके पास पर्याप्त [प्रतिष्ठा] (http://stackoverflow.com/help/whats-reputation) हो [किसी भी पोस्ट पर टिप्पणी करने में सक्षम] [http://stackoverflow.com/help/privileges/comment)। – Severin

+0

@ सेवरिन कैसे नहीं आते? यह सवाल के एक (गलत) जवाब की तरह दिखता है। यह एक स्ट्रिंग से सभी अमान्य बाइट अनुक्रम को हटा देता है। यह सिर्फ सभी वैध लोगों को भी हटा देता है। –

1

रूबी 2.0 और 1.9.3

"€foo\xA0".encode(Encoding::UTF_8, Encoding::UTF_8, :invalid => :replace) 

रूबी 2.1+

"€foo\xA0".scrub 
संबंधित मुद्दे