Comment puis-je URI::encode
une chaîne comme:
\x12\x34\x56\x78\x9a\xbc\xde\xf1\x23\x45\x67\x89\xab\xcd\xef\x12\x34\x56\x78\x9a
pour l'obtenir dans un format comme:
%124Vx%9A%BC%DE%F1%23Eg%89%AB%CD%EF%124Vx%9A
selon RFC 1738?
Voici ce que j'ai essayé:
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>'
Aussi:
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>'
J'ai tout regardé sur Internet et je n'ai pas trouvé de moyen de le faire, même si je suis presque certain que l'autre jour, j'ai fait cela sans aucun problème.
Réponses:
la source
force_encoding('binary')
pourrait être un choix plus auto-documenté.CGI.escape
plutôt * *. -> http://www.ruby-forum.com/topic/207489#903709 . Vous devriez également pouvoir utiliserURI.www_form_encode
*URI.www_form_encode_component
*, mais je ne les ai jamais utilisésrequire 'open-uri'
ici. Voulez-vous direrequire 'uri'
?'a=&!@&b=&$^'
à CGI.escape, il échappera à tout avec des séparateurs de requête&
afin que cela ne puisse être utilisé que pour interroger des valeurs. Je suggère d'utiliseraddressable
gem, c'est plus intellectuel de travailler avec des URL.De nos jours, vous devez utiliser
ERB::Util.url_encode
ouCGI.escape
. La principale différence entre eux est leur gestion des espaces:CGI.escape
suit la spécification des formulaires CGI / HTML et vous donne uneapplication/x-www-form-urlencoded
chaîne, qui exige que les espaces soient échappés+
, alors queERB::Util.url_encode
suit la RFC 3986 , qui exige qu'ils soient encodés comme%20
.Voir « Quelle est la différence entre URI.escape et CGI.escape? » Pour plus de détails.
la source
Tiré du commentaire de @ J-Rou
la source
Vous pouvez utiliser des
Addressable::URI
gemmes pour cela:Il utilise un format plus moderne que
CGI.escape
, par exemple, il encode correctement l'espace en tant%20
que+
signe et non en tant que signe, vous pouvez en savoir plus dans " Le type application / x-www-form-urlencoded " sur Wikipedia.la source
CGI.escape('Hello, this is me').gsub("+", "%20")
=> Hello%2C%20this%20is%20me"
si vous ne voulez pas utiliser de gemmesJ'ai créé un joyau pour rendre le codage URI plus propre à utiliser dans votre code. Il s'occupe de l'encodage binaire pour vous.
Exécutez
gem install uri-handler
, puis utilisez:Il ajoute la fonctionnalité de conversion URI dans la classe String. Vous pouvez également lui passer un argument avec la chaîne de codage facultative que vous souhaitez utiliser. Par défaut, il est défini sur le codage «binaire» si le codage UTF-8 simple échoue.
la source
Code:
Résultat:
la source
J'essayais à l'origine d'échapper aux caractères spéciaux dans un nom de fichier uniquement, pas sur le chemin, à partir d'une chaîne URL complète.
ERB::Util.url_encode
n'a pas fonctionné pour mon utilisation:Basé sur deux réponses dans " Pourquoi URI.escape () est-il marqué comme obsolète et où est cette constante REGEXP :: UNSAFE? ", Il semble que
URI::RFC2396_Parser#escape
c'est mieux que d'utiliserURI::Escape#escape
. Cependant, ils se comportent tous les deux de la même manière:la source
Si vous voulez "encoder" une URL complète sans avoir à penser à la diviser manuellement en ses différentes parties, j'ai trouvé que ce qui suit fonctionnait de la même manière que j'utilisais
URI.encode
:la source