¿Cómo me URI::encode
gusta 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 usaraddressable
gem, es más intelectual trabajar con urls.Hoy en día, debes usar
ERB::Util.url_encode
oCGI.escape
. La principal diferencia entre ellos es su manejo de espacios:CGI.escape
sigue la especificación de formularios CGI / HTML y le proporciona unaapplication/x-www-form-urlencoded
cadena, que requiere que se escapen espacios+
, mientras queERB::Util.url_encode
sigue 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::URI
gema para eso: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 " 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_encode
no 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#escape
es 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