के लिए एन्कोडिंग (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 मिल के रूप में आप उम्मीद करेंगे।