Ładne znalezisko!
Krótka odpowiedź jest całkowicie dowolna i zależy od tego, w jaki sposób Ruby wewnętrznie tworzy ciągi, które są zwracane.
Istnieje cały szereg wewnętrznych funkcji C, które konstruują puste ciągi lub literalne łańcuchy z kodowaniem US-ASCII: rb_usascii_str_new
i podobne. Są często używane do konstruowania ciągów przez dołączanie mniejszych fragmentów strun. Prawie każdy to_s
metoda robi to:
[].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>
Więc dlaczego nie Object.new.to_s
? Kluczem jest tutaj, że Object#to_s
jest klasą awaryjną to_s
dla klasy , więc aby uczynić ją generyczną, a jednocześnie informatywną, zakodowała ją, aby wyprowadzić wartość wewnętrznego wskaźnika obiektu. Najłatwiej to zrobić z sprintf
i specyfikatorem %p
. ALE Ktokolwiek zakodował zapakowanie Ruby sprintf
rb_sprintf
, dostał leniwego i po prostu ustaw kodowanie na NULL
, które powraca do ASCII-8BIT
. Więc generalnie wszystko, co zwraca sformatowany ciąg będzie mieć to kodowanie:
Object.new.to_s
#<Encoding:ASCII-8BIT>
nil.sort rescue $!.to_s.encoding
#<Encoding:ASCII-8BIT>
[].each.to_s.encoding
#<Encoding:ASCII-8BIT>
Jak ciągów zdefiniowanych przez skrypt, ci uzyskać domyślne kodowanie UTF-8, jak można by oczekiwać.