2012-06-19 17 views
5

Estoy experimentando cierta confusión en el método Kernel#sprintf en Ruby.Ruby sprintf actuando en 1.9

Ruby 1.9 maneja la codificación de una manera diferente a la de Ruby 1.8.

Estos son los resultados que busco, y cómo se comporta en Ruby 1.8:

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

Ésta es la forma en que se comporta de Ruby 1.9:

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

Si utilizo el comentario mágica para establecer la codificación en binario (ascii-8 bits) me aparece un error:

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

también he intentado esto con Ruby 1.9.2 por lo º No parece ser específico de 1.9.3.

¿Tal vez estoy haciendo algo mal? No estoy tan familiarizado con el método Kernel#sprintf.

Estoy usando una biblioteca smpp llamada ruby-smpp que se puede encontrar en github. Es el método send_concat_mt en la línea # 47 que está actuando cuando estoy tratando de ejecutarlo en Ruby 1.9.3.

Agradecería mucho que alguno de ustedes pudiera arrojar algo de luz sobre este asunto.

+0

Probablemente comience a soportar Unicode, de ahí el comportamiento. No creo que deba confiar en esta "característica" de 'sprintf'. – nhahtdh

+0

Sí, podemos ver eso en mis ejemplos. Y no esperas que debería confiar en un método en ruby ​​stdlib cuya documentación dice lo mismo en ambas versiones? Como digo en mi pregunta, parece que estoy haciendo algo mal – Lisinge

Respuesta

1

La documentación sprintf:

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

88599 no es un código numérico válido para un solo carácter en el comportamiento por defecto para Ruby 1.8; que, creo, no es una codificación. Lo que parece estar haciendo está haciendo un mod 256 en el valor que proporcione y luego convertirlo:

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

cuanto a que hacer algo mal, no. Lo que sucedió es que permitir códigos de caracteres fuera de límites fue un error que Ruby 1.9 ha corregido y ahora arroja una excepción.

Cuestiones relacionadas