2012-06-19 11 views
5

Mam pewne zamieszanie na metodzie Kernel#sprintf w Ruby.Ruby sprintf działające w 1.9

Ruby 1.9 obsługuje kodowanie w inny sposób niż Ruby 1.8.

Oto wyniki jestem po, i jak się zachowuje w Ruby 1.8:

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

W ten sposób zachowuje się w Ruby 1.9:

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

Jeśli użyję magicznego komentarz ustawić kodowanie na binarny (aSCII-8bit) pojawia się błąd:

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>' 

próbowałem również ten z Ruby 1.9.2 tak th Wydaje się, że nie jest on specyficzny dla wersji 1.9.3.

Może robię coś nie tak? Nie jestem zaznajomiony z metodą Kernel#sprintf.

Używam biblioteki smpp o nazwie ruby-smpp, którą można znaleźć pod adresem github. Jest to metoda send_concat_mt na linii # 47, która działa, gdy próbuję uruchomić ją w Rubim 1.9.3.

Byłbym bardzo wdzięczny, gdyby któryś z was mógł rzucić trochę światła na tę sprawę.

+0

Prawdopodobnie zaczyna obsługiwać Unicode, stąd zachowanie. Nie sądzę, że powinieneś polegać na tej "funkcji" programu 'sprintf'. – nhahtdh

+0

Tak, widzimy to w moich przykładach. A ty nie gruby, że powinienem polegać na metodzie w ruby ​​stdlib której dokumentacji mówi to samo w obu wersjach? Jak mówię w moim pytaniu, wygląda na to, że robię coś źle – Lisinge

Odpowiedz

1

Państwa dokumentacji sprintf:

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

88599 nie jest poprawny kod numeryczny dla pojedynczego znaku w zachowanie domyślne dla Ruby 1.8; które, jak sądzę, nie jest kodowaniem. Co wydaje się, że robi to robi mod 256 na wartość dostarczoną a następnie przekształcenie go:

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

Jak wam robi coś złego, nie. Stało się tak, że zezwolenie na kodowanie znaków poza polem było błędem, który został naprawiony przez Ruby 1.9, która teraz poprawnie zgłasza wyjątek.