Como faço para URI::encode
uma string como:
\x12\x34\x56\x78\x9a\xbc\xde\xf1\x23\x45\x67\x89\xab\xcd\xef\x12\x34\x56\x78\x9a
para obtê-lo em um formato como:
%124Vx%9A%BC%DE%F1%23Eg%89%AB%CD%EF%124Vx%9A
conforme RFC 1738?
Aqui está o que eu tentei:
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>'
Além disso:
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>'
Eu procurei na Internet e não encontrei uma maneira de fazer isso, embora eu esteja quase certo de que outro dia fiz isso sem nenhum problema.
Respostas:
fonte
force_encoding('binary')
pode ser uma opção mais auto-documentada.CGI.escape
*. -> http://www.ruby-forum.com/topic/207489#903709 . Você também deve ser capaz de usarURI.www_form_encode
*URI.www_form_encode_component
*, mas eu nunca usei aquelesrequire 'open-uri'
aqui. Você quis dizerrequire 'uri'
?'a=&!@&b=&$^'
para CGI.escape, ele escapará de tudo com separadores de consulta,&
portanto, isso pode ser usado apenas para consultar valores. Eu sugiro usaraddressable
gem, é mais intelectual trabalhar com URLs.Atualmente, você deve usar
ERB::Util.url_encode
ouCGI.escape
. A principal diferença entre eles é a manipulação de espaços:CGI.escape
segue a especificação dos formulários CGI / HTML e fornece umaapplication/x-www-form-urlencoded
string, que requer que os espaços sejam escapados+
, enquantoERB::Util.url_encode
segue a RFC 3986 , que exige que eles sejam codificados como%20
.Consulte " Qual é a diferença entre URI.escape e CGI.escape? " Para obter mais discussões.
fonte
Retirado do comentário de @ J-Rou
fonte
Você pode usar
Addressable::URI
gemas para isso:Ele usa um formato mais moderno do que
CGI.escape
, por exemplo, codifica corretamente o espaço como%20
e não como+
sinal. Você pode ler mais em " O tipo application / x-www-form-urlencoded " na Wikipedia.fonte
CGI.escape('Hello, this is me').gsub("+", "%20")
=> Hello%2C%20this%20is%20me"
se não quiser usar gemas #Criei uma gema para tornar o material de codificação de URI mais limpo para usar em seu código. Ele cuida da codificação binária para você.
Execute
gem install uri-handler
e use:Ele adiciona a funcionalidade de conversão de URI à classe String. Você também pode passar um argumento com a string de codificação opcional que você gostaria de usar. Por padrão, ele define a codificação 'binária' se a codificação direta UTF-8 falhar.
fonte
Código:
Resultado:
fonte
Inicialmente, eu estava tentando escapar de caracteres especiais apenas em um nome de arquivo, não no caminho, de uma string de URL completa.
ERB::Util.url_encode
não funcionou para o meu uso:Com base em duas respostas em " Por que o URI.escape () está marcado como obsoleto e onde é essa constante REGEXP :: UNSAFE? ", Parece que
URI::RFC2396_Parser#escape
é melhor do que usarURI::Escape#escape
. No entanto, ambos estão se comportando da mesma maneira para mim:fonte
Se você deseja "codificar" um URL completo sem precisar pensar em dividi-lo manualmente em diferentes partes, achei o seguinte funcionando da mesma maneira que costumava usar
URI.encode
:fonte