2012-06-19 2 views
5

У меня возникает некоторая путаница в методе Kernel#sprintf в Ruby.Ruby sprintf, действующий в 1.9

Ruby 1.9 обрабатывает кодировку по-другому, чем Ruby 1.8.

Вот результаты я после, и как он ведет себя в Ruby 1.8:

>> RUBY_VERSION 
=> "1.8.7" 
>> sprintf("%c", 88599) 
=> "\027" 

Это, как он ведет себя в Ruby 1.9:

1.9.3p194 :001 > RUBY_VERSION 
=> "1.9.3" 
1.9.3p194 :002 > sprintf("%c", 88599) 
=> "\u{15A17}" 

Если я использую магический комментарий к установить кодировку бинарной (ASCII-8bit) Я получаю сообщение об ошибке:

1.9.3p194 :001 > RUBY_VERSION 
=> "1.9.3" 
1.9.3p194 :002 > # encoding: binary 
1.9.3p194 :003 > sprintf("%c", 88599) 
RangeError: 88599 out of char range 
from (irb):3:in `sprintf' 
from (irb):3 
from /Users/lisinge/.rvm/rubies/ruby-1.9.3-p194/bin/irb:16:in `<main>' 

Я также попытался это с Руби 1.9.2 так е как представляется, не относится к 1.9.3.

Возможно, я что-то не так? Я не очень хорошо знаком с методом Kernel#sprintf.

Я использую библиотеку smpp под названием ruby-smpp, которая находится на github. Это метод send_concat_mt в строке # 47, который действует, когда я пытаюсь запустить его в Ruby 1.9.3.

Я был бы очень признателен, если бы кто-нибудь из вас мог пролить свет на этот вопрос.

+0

Возможно, он начинает поддерживать Unicode, следовательно, поведение. Я не думаю, что вы должны полагаться на эту «особенность» 'sprintf'. – nhahtdh

+0

Да, мы можем видеть это в моих примерах. И у вас толстый, что я должен полагаться на метод в ruby ​​stdlib, из которого документация говорит то же самое в обеих версиях? Как я уже говорил в своем вопросе, кажется, что я делаю что-то неправильно – Lisinge

ответ

1

В Sprintf документация говорится:

Field | Other Format 
------+-------------------------------------------------------------- 
    c | Argument is the numeric code for a single character or 
     | a single character string itself. 

88599 не является допустимым числовым кодом для одного символа в поведении по умолчанию для Ruby 1.8; который, я считаю, не является кодировкой. Что это, кажется, делает это делает мод 256 на значение вы поставляете, а затем преобразовать его:

% irb 
1.9.3-p194 :003 > 88599 % 256 == 027 
=> true 

Как вам делать что-то не так, нет. Что произошло, так это то, что использование кодов символов вне границ было ошибкой, которая была исправлена ​​Ruby 1.9, которая теперь правильно генерирует исключение.

Смежные вопросы