2015-11-14 6 views
6

में स्ट्रिंग एन्कोडिंग मैंने हाल ही में रूबी में एन्कोडिंग के साथ काम करना शुरू किया, और कुछ व्यवहार से उलझन में हूं।रुबी

मैं 2.2.3p173 उपयोग कर रहा हूँ और दिखा रहा है:

__ENCODING__    #=> #<Encoding:UTF-8> Default encoding in 2.2.3 

"my_string".encoding  #=> #<Encoding:UTF-8> 
Object.to_s.encoding  #=> #<Encoding:US-ASCII> 
Object.new.to_s.encoding #=> #<Encoding:ASCII-8BIT> 

एनकोडिंग में इस विसंगति का कारण क्या है?

उत्तर

4

के लिए एन्कोडिंग (rb_usascii_str_new2) harcoded है अच्छा लगता है!

संक्षिप्त उत्तर यह पूरी तरह से मनमाना है और यह इस बात पर निर्भर करता है कि रूबी आंतरिक रूप से वापस आने वाले तारों को कैसे बनाता है।

आंतरिक सी कार्यों का एक पूरा मेजबान है जो यूएस-एएससीआईआई एन्कोडिंग के साथ खाली तार या शाब्दिक तारों का निर्माण करता है: rb_usascii_str_new और इसी तरह। वे तारों के छोटे टुकड़ों को जोड़कर तारों का निर्माण करने के लिए अक्सर उपयोग किए जाते हैं।

[].to_s.encoding 
#<Encoding:US-ASCII> 
{}.to_s.encoding 
#<Encoding:US-ASCII> 
$/.to_s.encoding 
#<Encoding:US-ASCII> 
1.to_s.encoding 
#<Encoding:US-ASCII> 
true.to_s.encoding 
#<Encoding:US-ASCII> 
Object.to_s.encoding 
#<Encoding:US-ASCII> 

तो क्यों Object.new.to_s नहीं: लगभग हर to_s विधि इस करता है? यहां कुंजी यह है कि Object#to_sप्रत्येक कक्षा के लिए फ़ॉलबैक to_s विधि है, इसलिए इसे सामान्य-अभी-जानकारीपूर्ण बनाने के लिए उन्होंने ऑब्जेक्ट के आंतरिक सूचक के मान को आउटपुट करने के लिए कोड किया। ऐसा करने का सबसे आसान तरीका sprintf और %p विनिर्देशक के साथ है। लेकिन जो भी रूबी के sprintf रैपर को कोड किया गया rb_sprintf आलसी हो गया और केवल NULL पर एन्कोडिंग सेट करें जो ASCII-8BIT पर वापस आती है। तो आम तौर पर कुछ भी देता है कि एक स्वरूपित स्ट्रिंग इस एन्कोडिंग होगा:

Object.new.to_s 
#<Encoding:ASCII-8BIT> 
nil.sort rescue $!.to_s.encoding 
#<Encoding:ASCII-8BIT> 
[].each.to_s.encoding 
#<Encoding:ASCII-8BIT> 

एक स्क्रिप्ट द्वारा परिभाषित तार का सवाल है, उन डिफ़ॉल्ट एन्कोडिंग UTF-8 मिल के रूप में आप उम्मीद करेंगे।

1

ObjectC में परिभाषित किया गया है यदि आप निम्न प्रयास करें:

String(123456).encoding #=> #<Encoding:ASCII-8BIT> 
"123456".encoding  #=> #<Encoding:UTF-8> 

मैं गहरे लाल रंग का स्रोत कोड में एक बहुत खुदाई नहीं था, लेकिन यह looks चाहते to_s