149 votes

Comment coder une chaîne de caractères en Ruby ?

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

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 cherché partout sur Internet et je n'ai pas trouvé de moyen de le faire, bien que je sois presque certain de l'avoir fait l'autre jour sans le moindre problème.

1 votes

Peut-être utile si vous utilisez Ruby 1.9 : yehudakatz.com/2010/05/05/…

6voto

foomip Points 201

J'ai créé une gemme pour rendre l'encodage des URI plus propre à utiliser dans votre code. Elle s'occupe de l'encodage binaire pour vous.

Exécuter gem install uri-handler puis utiliser :

require 'uri-handler'

str = "\x12\x34\x56\x78\x9a\xbc\xde\xf1\x23\x45\x67\x89\xab\xcd\xef\x12\x34\x56\x78\x9a".to_uri
# => "%124Vx%9A%BC%DE%F1%23Eg%89%AB%CD%EF%124Vx%9A"

Il ajoute la fonctionnalité de conversion URI dans la classe String. Vous pouvez également lui passer un argument avec la chaîne d'encodage optionnelle que vous souhaitez utiliser. Par défaut, il utilise l'encodage "binaire" si l'encodage UTF-8 direct échoue.

5voto

thiagofalcao Points 850

Code :

str = "http://localhost/with spaces and spaces"
encoded = URI::encode(str)
puts encoded

Résultat :

http://localhost/with%20spaces%20and%20spaces

3voto

devalias Points 112

Si vous voulez "coder" une URL complète sans avoir à penser à la diviser manuellement en ses différentes parties, j'ai trouvé que la méthode suivante fonctionnait de la même manière que celle que j'utilisais auparavant URI.encode :

URI.parse(my_url).to_s

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X