2011-12-26 19 views
5

यह जांचने के लिए कि क्या चरित्र सेट utf-8 एन्कोडिंग में है, ruby ​​| ror के माध्यम से?यह जांचने के लिए कि क्या चरित्र utf-8

+0

आप अगर आप पहले से ही सही एन्कोडिंग के साथ स्मृति में स्ट्रिंग है, या आप क्या मतलब है इससे पहले कि आप भी स्मृति में स्ट्रिंग को पढ़ने के लिए शुरू (जैसे कि, डिस्क पर एक फ़ाइल से) मतलब है ? – d11wtq

उत्तर

8

वहाँ रूबी में और न ही कहीं और इस, ऐसा करने के लिए कोई निश्चित तरीका है:

str = 'foo' # start with a simple string 
# => "foo" 
str.encoding 
# => #<Encoding:UTF-8> # which is UTF-8 encoded 
str.bytes.to_a 
# => [102, 111, 111] # as you can see, it consists of three bytes 102, 111 and 111 
str.encode!('us-ascii') # now we will recode the string to 8-bit us-ascii encoding 
# => "foo" 
str.encoding 
# => #<Encoding:US-ASCII> 
str.bytes.to_a 
# => [102, 111, 111] # see, same three bytes 
str.encode!('windows-1251') # let us try some cyrillic 
# => "foo" 
str.encoding 
# => #<Encoding:Windows-1251> 
str.bytes.to_a 
# => [102, 111, 111] # see, the same three again! 
बेशक

, आप कुछ सांख्यिकीय उपयोग कर सकते हैं पाठ पर विश्लेषण, और एन्कोडिंग को खत्म करें जो पाठ मान्य नहीं है, लेकिन सैद्धांतिक रूप से, यह हल करने योग्य समस्या नहीं है।

+0

"यह करने के लिए कोई निश्चित तरीका नहीं है, रुबी में और न ही कहीं और", आह, यूनिकोड युद्धों के एक उत्तेजित सोल्डर की तरह कहा। वहां गया, ऐसा किया, मुझे तुम्हारा दर्द महसूस होता है। :-) मैं पाठ के सांख्यिकीय विश्लेषण पर भी वापस आ गया, जो कि ज्यादातर समय काम करता था। यह आश्चर्यजनक है कि एचटीएमएल, आरएसएस और एक्सएमएल कितनी बुरी तरह टूट सकती है जब कोई चश्मे के संबंध में चीजों को काम करने के लिए निर्धारित होता है। –

+0

[स्ट्रिंग # valid_encoding?] (Http://ruby-doc.org/core-2.1.0/String.html#method-i-valid_encoding-3F) के बारे में क्या? उदाहरण: '"आंशिक वैध \ xE4 यूटीएफ -8 एन्कोडिंग: äöüß"। Valid_encoding? ' –

+0

' valid_encoding?' जांचता है कि किसी स्ट्रिंग में अमान्य बाइट अनुक्रम हैं या नहीं। यह नहीं कहता है कि (अन्यथा मान्य) बाइट अनुक्रम कुछ एन्कोडिंग से निकलता है, और मेरा मानना ​​है कि यह सवाल था। –

1
"your string".encoding 
# => #<Encoding:UTF-8> 

या आप यह progmatically चाहते हैं,

"your string".encoding.name == "UTF-8" 
# => true 
+5

यह केवल स्ट्रिंग ऑब्जेक्ट पर एन्कोडिंग सेट की जांच करता है, न कि इसकी सामग्री के वास्तविक एन्कोडिंग। इस बात की कोई गारंटी नहीं है कि वास्तविक सामग्री उसी एन्कोडिंग का उपयोग करके एन्कोड किया गया है। –

6

चेक UTF-8 वैधता

सबसे मल्टी-बाइट एन्कोडिंग के लिए यह प्रोग्राम के रूप में अवैध बाइट-दृश्यों का पता लगाने के लिए संभव है। रूबी के रूप में डिफ़ॉल्ट व्यवहार करता है के द्वारा सभी स्ट्रिंग्स UTF-8 होने के लिए आपको देख सकते हैं कि एक स्ट्रिंग वैध UTF-8 में दी गई है:,

इसके अतिरिक्त

# encoding: UTF-8 
# ------------------------------------------- 
str = "Partly valid\xE4 UTF-8 encoding: äöüß" 

str.valid_encoding? 
    # => false 

str.scrub('').valid_encoding? 
    # => true 

Convert एन्कोडिंग अगर एक स्ट्रिंग वैध UTF-8 एन्कोडिंग नहीं है, लेकिन क्या आप जानते हैं वास्तविक वर्ण-एन्कोडिंग, आप स्ट्रिंग को UTF-8 एन्कोडिंग में परिवर्तित कर सकते हैं।

उदाहरण
कभी कभी, आप एक स्थिति है, जिसमें आप जानते हैं कि एक इनपुट-फ़ाइल की एन्कोडिंग या तो UTF-8 या CP1252 (यानी Windows-1252) है में समाप्त।
चेक जो यह एन्कोडिंग और UTF-8 (यदि आवश्यक हो) में बदलने का:

# encoding: UTF-8 
# ------------------------------------------------------ 
test = "String in CP1252 encoding: \xE4\xF6\xFC\xDF" 
File.open('input_file', 'w') {|f| f.write(test)} 

str = File.read('input_file') 

unless str.valid_encoding? 
    str.encode!('UTF-8', 'CP1252', invalid: :replace, undef: :replace, replace: '?') 
end #unless 
    # => "String CP1252 encoding: äöüß" 

=======
नोट्स

  • यह पता लगाने के लिए प्रोग्राम के रूप में संभव है बहुत अधिक विश्वसनीयता के साथ यूटीएफ -8 (रूबी, see: #valid_encoding?) में अधिकांश बहु-बाइट एन्कोडिंग। केवल 16 बाइट्स के बाद, एक यादृच्छिक बाइट-अनुक्रम की संभावना वैध यूटीएफ -8 is only 0.01% है। (UTF-8 BOM पर निर्भर के साथ इसकी तुलना)

  • हालांकि, यह आसानी से संभव नहीं है प्रोग्राम के रूप में (में) CP1252 या ISO-8859-1 की तरह एकल-बाइट-एनकोडिंग की वैधता का पता लगाने के। इस प्रकार उपर्युक्त कोड स्निपेट दूसरी तरफ काम नहीं करता है, यानी यह पता लगाना कि क्या स्ट्रिंग मान्य है CP1252 एन्कोडिंग।

  • हालांकि UTF-8 वेब, CP1252 और अन्य Latin1 जायके विशेष रूप से उत्तरी अमेरिका में, पश्चिमी देशों में बहुत लोकप्रिय अभी भी कर रहे हैं में डिफ़ॉल्ट एन्कोडिंग के रूप में तेजी से लोकप्रिय हो गया है। ध्यान रखें कि वहां कई सिंगल-बाइट एन्कोडिंग हैं जो बहुत समान हैं, लेकिन CP1252 (ए.के.ए. Windows-1252) से थोड़ा अलग है।उदाहरण: ISO-8859-1, ISO-8859-15

+0

'" सीपी 1252 एन्कोडिंग में स्ट्रिंग: \ xE4 \ xF6 \ xFC \ xDF "मुझे विश्वास है कि सवाल यह था कि आप इसे सीपी 1252 एन्कोडिंग_ में कैसे देखते हैं। –

+0

मैंने सोचा, सवाल यह था कि यदि दिया गया स्ट्रिंग (वैध) 'यूटीएफ -8' एन्कोडिंग में है या नहीं। आप 'स्ट्रिंग' str' पर 'str.valid_encoding?' को कॉल करके ऐसा करते हैं जो 'UTF-8'-एन्कोडिंग में है। क्या यह मेरे उत्तर से स्पष्ट नहीं है? –

+0

प्रोग्रामेटिक रूप से, आप (या कम से कम आसानी से और निश्चित रूप से विश्वसनीय नहीं हैं) एक स्ट्रिंग की अमान्यता को एक-बाइट-एन्कोडिंग जैसे 'CP1252' में जांच सकते हैं। हालांकि, आप बहुत भरोसेमंद (स्ट्रिंग की लंबाई के आधार पर) एक बहु-बाइट-एन्कोडिंग जैसे 'यूटीएफ -8'' में स्ट्रिंग की अमान्यता की जांच कर सकते हैं। –

संबंधित मुद्दे