Как последовательно получить кодировку ASCII-8BIT в Ruby? - PullRequest
0 голосов
/ 09 февраля 2020

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 будет:

#<Encoding:UTF-8>

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

1 Ответ

1 голос
/ 10 февраля 2020

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

# encoding: ASCII-8BIT

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

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

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

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

...