¿Cómo me URI::encodegusta una cadena:
\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 probé:
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>'
Busqué todo en Internet y no he encontrado la manera de hacerlo, aunque estoy casi seguro de que el otro día lo hice sin ningún problema.

Respuestas:
fuente
force_encoding('binary')podría ser una opción más autodocumentada.CGI.escape* en su lugar. -> http://www.ruby-forum.com/topic/207489#903709 . También deberías poder usarURI.www_form_encode*URI.www_form_encode_component*, pero nunca los he usadorequire 'open-uri'aquí. Quiso decirrequire 'uri'?'a=&!@&b=&$^'a CGI.escape, escapará de todo con separadores de consulta,&por lo que esto podría usarse solo para consultar valores. Sugiero usaraddressablegem, es más intelectual trabajar con urls.Hoy en día, debes usar
ERB::Util.url_encodeoCGI.escape. La principal diferencia entre ellos es su manejo de espacios:CGI.escapesigue la especificación de formularios CGI / HTML y le proporciona unaapplication/x-www-form-urlencodedcadena, que requiere que se escapen espacios+, mientras queERB::Util.url_encodesigue RFC 3986 , que requiere que se codifiquen como%20.Consulte " ¿Cuál es la diferencia entre URI.escape y CGI.escape? " Para obtener más información.
fuente
Tomado del comentario de @ J-Rou
fuente
Puedes usar
Addressable::URIgema para eso:Utiliza un formato más moderno que
CGI.escape, por ejemplo, codifica correctamente el espacio como%20y no como+signo, puede leer más en " La aplicación / x-www-form-urlencoded type " en Wikipedia.fuente
CGI.escape('Hello, this is me').gsub("+", "%20")=> Hello%2C%20this%20is%20me"si no quiere usar gemasCreé una gema para hacer que las cosas de codificación URI sean más limpias para usar en su código. Se encarga de la codificación binaria por ti.
Corre
gem install uri-handler, luego usa:Agrega la funcionalidad de conversión de URI a la clase String. También puede pasarle un argumento con la cadena de codificación opcional que le gustaría usar. De forma predeterminada, se establece en codificación 'binaria' si falla la codificación directa UTF-8.
fuente
Código:
Resultado:
fuente
Originalmente estaba tratando de escapar de caracteres especiales solo en un nombre de archivo, no en la ruta, de una cadena URL completa.
ERB::Util.url_encodeno funcionó para mi uso:Basado en dos respuestas en " ¿Por qué URI.escape () está marcado como obsoleto y dónde está esta constante REGEXP :: UNSAFE? ", Parece que
URI::RFC2396_Parser#escapees mejor que usarloURI::Escape#escape. Sin embargo, ambos se comportan igual para mí:fuente
Si desea "codificar" una URL completa sin tener que pensar en dividirla manualmente en sus diferentes partes, descubrí que lo siguiente funcionó de la misma manera que solía usar
URI.encode:fuente