Ruby l'encodage de l'url de la chaîne
Comment puis-je URI::encode une chaîne de caractères 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
(conformément à la 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 regardé tous sur internet et n'ai pas trouvé (ou, plus probablement raté) est une manière de le faire, même si je suis presque certain que l'autre jour je l'ai fait sans aucune difficulté.
Merci!
- Cela peut être utile si l'aide de Ruby 1.9: yehudakatz.com/2010/05/05/...
Vous devez vous connecter pour publier un commentaire.
Mise à JOUR: voir le commentaire ci-dessous Ruby l'encodage de l'url de la chaîne
force_encoding('binary')
serait peut-être plus auto-documenter les choix.CGI.escape
* à la place. -> http://www.ruby-forum.com/topic/207489#903709. Vous devez également être en mesure d'utiliserURI.www_form_encode
*URI.www_form_encode_component
*, mais je n'ai jamais utilisé cesrequire 'open-uri'
ici. Vouliez-vous direrequire 'uri'
?'a=&!@&b=&$^'
de CGI.échapper il va échapper à tout avec de la requête séparateurs&
si ce pouvait être utilisé que pour des valeurs de requête. Je suggère d'utiliseraddressable
bijou , il est plus intellectuel de travail avec des url.Prises de @J-Rou commentaire
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 CGI/formulaires HTML spec et vous donne unapplication/x-www-form-urlencoded
chaîne, ce qui nécessite des espaces échappé à+
, alors queERB::Util.url_encode
suit RFC 3986, ce qui nécessite d'être codé comme%20
.Voir cette réponse pour plus de discussion.
Vous pouvez utiliser
Addressable::URI
gem pour que:Il utilise plus de format moderne, que
CGI.escape
, par exemple, il encode correctement l'espace comme%20
et non pas comme+
signe, vous pouvez en lire plus dans article de wikipediaCGI.escape('Hello, this is me').gsub("+", "%20")
=> Hello%2C%20this%20is%20me"
si vous ne voulez pas utiliser de gemmesJ'ai créé un bijou pour faire de l'encodage des uri stuff nettoyant à utiliser dans votre code. Il prend soin de codage binaire (pour vous, ajouté un peu de l'exemple des trucs dans le code ci-dessus).
Exécuter
gem install uri-handler
.Il ajoute l'uri de la fonctionnalité de conversion dans la classe String. Vous pouvez également passer d'un argument à l'option d'encodage de la chaîne que vous souhaitez utiliser (par défaut définit l'encodage binaire " si la droite l'encodage UTF-8 qui échoue).
J'ai été à l'origine d'essayer d'échapper les caractères spéciaux pour les noms de fichiers uniquement (pas sur le chemin d'accès) à partir de l'url complète de la chaîne.
ERB::Util.url_encode
n'a pas fonctionné pour mon utilisation.Sur la base de 2 les réponses des différents DONC question, il ressemble à
URI::RFC2396_Parser#escape
est mieux que d'utiliserURI::Escape#escape
. Cependant, ils sont tous les deux à se comporter de la même chose pour moi.Si vous voulez 'encode' une URL complète, sans avoir à y penser manuellement de le diviser en différentes parties, j'ai trouvé le suivant travaillé de la même manière que je l'habitude d'utiliser
URI.encode
: