ruby-on-rails - restful - routes in ruby on rails
Ruby url cadena de codificación (6)
¿Cómo puedo URI :: codificar una cadena como:
/x12/x34/x56/x78/x9a/xbc/xde/xf1/x23/x45/x67/x89/xab/xcd/xef/x12/x34/x56/x78/x9a
Para obtenerlo en un formato como:
%124Vx%9A%BC%DE%F1%23Eg%89%AB%CD%EF%124Vx%9A
(según RFC 1738)
Esto es lo que he intentado:
irb(main):123:0> URI::encode "/x12/x34/x56/x78/x9a/xbc/xde/xf1/x23/x45/x67/x89/xab/xcd/xef/x12/x34/x56/x78/x9a"
ArgumentError: invalid byte sequence in UTF-8
from /usr/local/lib/ruby/1.9.1/uri/common.rb:219:in `gsub''
from /usr/local/lib/ruby/1.9.1/uri/common.rb:219:in `escape''
from /usr/local/lib/ruby/1.9.1/uri/common.rb:505:in `escape''
from (irb):123
from /usr/local/bin/irb:12:in `<main>''
También,
irb(main):126:0> CGI::escape "/x12/x34/x56/x78/x9a/xbc/xde/xf1/x23/x45/x67/x89/xab/xcd/xef/x12/x34/x56/x78/x9a"
ArgumentError: invalid byte sequence in UTF-8
from /usr/local/lib/ruby/1.9.1/cgi/util.rb:7:in `gsub''
from /usr/local/lib/ruby/1.9.1/cgi/util.rb:7:in `escape''
from (irb):126
from /usr/local/bin/irb:12:in `<main>''
He buscado todo en Internet y no he encontrado (o más probablemente extraño) una forma de hacerlo, aunque estoy casi seguro de que el otro día lo hice sin ningún problema.
¡Gracias!
Creé una gema para hacer que la codificación de uri sea más limpia para usar en tu código. Se encarga de la codificación binaria para usted (agregó algunas de las cosas de ejemplo en el código anterior).
Ejecute gem install uri-handler
.
require ''uri-handler''
str = "/x12/x34/x56/x78/x9a/xbc/xde/xf1/x23/x45/x67/x89/xab/xcd/xef/x12/x34/x56/x78/x9a".to_uri
# => "%124Vx%9A%BC%DE%F1%23Eg%89%AB%CD%EF%124Vx%9A"
Agrega la funcionalidad de conversión uri a la clase String. También puede pasarle un argumento con la cadena de codificación opcional que le gustaría usar (de manera predeterminada establece la codificación ''binaria'' si la codificación UTF-8 recta falla).
Hoy en día, debe usar ERB::Util.url_encode
o CGI.escape
. La principal diferencia entre ellos es su manejo de espacios:
>> ERB::Util.url_encode("foo/bar? baz&")
=> "foo%2Fbar%3F%20baz%26"
>> CGI.escape("foo/bar? baz&")
=> "foo%2Fbar%3F+baz%26"
CGI.escape
sigue la especificación de formularios CGI / HTML y le proporciona una cadena application/x-www-form-urlencoded
, que requiere que los espacios se ERB::Util.url_encode
a +
, mientras que ERB::Util.url_encode
sigue a RFC 3986 , lo que requiere que se codifiquen como %20
.
Vea esta respuesta para más discusión.
Originalmente estaba tratando de escapar caracteres especiales en el nombre del archivo solamente (no en la ruta) de la cadena de URL completa. ERB::Util.url_encode
no funcionó para mi uso.
helper.send(:url_encode, "http://example.com/?a=/11/15")
# => "http%3A%2F%2Fexample.com%2F%3Fa%3D%09%0D"
Basado en 2 respuestas de diferentes question SO, parece que URI::RFC2396_Parser#escape
es mejor que usar URI::Escape#escape
. Sin embargo, ambos se están comportando igual para mí.
URI.escape("http://example.com/?a=/11/15")
# => "http://example.com/?a=%09%0D"
URI::Parser.new.escape("http://example.com/?a=/11/15")
# => "http://example.com/?a=%09%0D"
Puede usar la gema de Addressable::URI
para eso:
require ''addressable/uri''
string = ''/x12/x34/x56/x78/x9a/xbc/xde/xf1/x23/x45/x67/x89/xab/xcd/xef/x12/x34/x56/x78/x9a''
Addressable::URI.encode_component(string, Addressable::URI::CharacterClasses::QUERY)
# "%5Cx12%5Cx34%5Cx56%5Cx78%5Cx9a%5Cxbc%5Cxde%5Cxf1%5Cx23%5Cx45%5Cx67%5Cx89%5Cxab%5Cxcd%5Cxef%5Cx12%5Cx34%5Cx56%5Cx78%5Cx9a"
Utiliza un formato más moderno que CGI.escape
, por ejemplo, codifica correctamente el espacio como %20
y no como signo +
, puede leer más en el artículo de wikipedia
2.1.2 :008 > CGI.escape(''Hello, this is me'')
=> "Hello%2C+this+is+me"
2.1.2 :009 > Addressable::URI.encode_component(''Hello, this is me'', Addressable::URI::CharacterClasses::QUERY)
=> "Hello,%20this%20is%20me"
require ''uri''
str = "/x12/x34/x56/x78/x9a/xbc/xde/xf1/x23/x45/x67/x89/xab/xcd/xef/x12/x34/x56/x78/x9a".force_encoding(''ASCII-8BIT'')
puts URI::encode(str)
ACTUALIZACIÓN: vea el comentario debajo de la cadena de codificación Ruby url
str = "/x12/x34/x56/x78/x9a/xbc/xde/xf1/x23/x45/x67/x89/xab/xcd/xef/x12/x34/x56/x78/x9a"
require ''cgi''
CGI.escape(str)
# => "%124Vx%9A%BC%DE%F1%23Eg%89%AB%CD%EF%124Vx%9A"
Tomado del comentario de @J-Rou