Как последовательно получить кодировку ASCII-8BIT в Ruby?

Ruby кажется немного непоследовательным в обработке кодировок:

irb -E BINARY:BINARY
irb(main):001:0> "hi".encoding
=> #<Encoding:ASCII-8BIT>

Так что "работает". А как насчет обычного ruby ?

ruby -E BINARY:BINARY -e 'p "hi".encoding'
#<Encoding:US-ASCII>

Это не работает Кроме того, когда p "hi".encoding помещается в x.rb , вывод ruby -E BINARY:BINARY x.rb будет ruby -E BINARY:BINARY x.rb :

#<Encoding:UTF-8>

Как получить литералы ASCII-8BIT при вызове ruby ?

Всего 1 ответ


Строковые литералы имеют ту же кодировку, что и кодировка скрипта. Вместо 'hi'.encoding вы можете использовать ключевое слово __ENCODING__ чтобы получить его. Кодировку скрипта можно изменить, поместив волшебный комментарий в начале скрипта:

# encoding: ASCII-8BIT

p __ENCODING__ # => #<Encoding:ASCII-8BIT>

Флаг -E ruby не влияет на кодирование строковых литералов. Это только для изменения внешней и внутренней кодировки. Вы можете прочитать о различных типах кодировок и их назначении в документации по Encoding .

Вернемся к кодированию строковых литералов. Несмотря на то, что irb утверждает, что его флаг -E является «таким же, как ruby -E », это не так. Он использует внешнюю кодировку в качестве кодировки скрипта. irb уже есть несколько ограничений. Это может быть одним из них. Это как минимум ошибка документации.

Помимо волшебного комментария, есть еще один обескураживающий способ установить кодировку скрипта через ruby : флаг -K и n (нет) kcode. ruby -Kne "p __ENCODING__" должен вывести #<Encoding:ASCII-8BIT> . Однако -K также изменяет внешнюю кодировку.


Есть идеи?

10000