Jak mam URI::encode
taki ciąg:
\x12\x34\x56\x78\x9a\xbc\xde\xf1\x23\x45\x67\x89\xab\xcd\xef\x12\x34\x56\x78\x9a
aby uzyskać to w formacie takim jak:
%124Vx%9A%BC%DE%F1%23Eg%89%AB%CD%EF%124Vx%9A
zgodnie z RFC 1738?
Oto, czego próbowałem:
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>'
Również:
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>'
Rozejrzałem się po Internecie i nie znalazłem sposobu, aby to zrobić, chociaż jestem prawie pewien, że pewnego dnia zrobiłem to bez żadnych problemów.
Odpowiedzi:
źródło
force_encoding('binary')
może być bardziej samodokumentującym się wyborem.CGI.escape
zamiast tego używają * *. -> http://www.ruby-forum.com/topic/207489#903709 . Powinieneś także móc używaćURI.www_form_encode
*URI.www_form_encode_component
*, ale nigdy ich nie używałemrequire 'open-uri'
. Czy miałeś na myślirequire 'uri'
?'a=&!@&b=&$^'
do CGI.escape, ucieknie on z całości za pomocą separatorów zapytań,&
więc może to być użyte tylko do przeszukiwania wartości. Sugeruję użycieaddressable
gemów, praca z adresami URL jest bardziej intelektualna.W dzisiejszych czasach powinieneś używać
ERB::Util.url_encode
lubCGI.escape
. Podstawową różnicą między nimi jest obsługa przestrzeni:CGI.escape
jest zgodny ze specyfikacją formularzy CGI / HTML i podajeapplication/x-www-form-urlencoded
ciąg, do którego należy zastosować spacje+
, natomiast jestERB::Util.url_encode
zgodny ze specyfikacją RFC 3986 , która wymaga ich zakodowania jako%20
.Aby uzyskać więcej informacji, zobacz „ Jaka jest różnica między URI.escape i CGI.escape? ”.
źródło
Zaczerpnięte z komentarza @ J-Rou
źródło
Możesz do tego użyć
Addressable::URI
klejnotu:Używa nowocześniejszego formatu, niż
CGI.escape
np. Poprawnie koduje spacje jako znak,%20
a nie jako+
znak, o czym więcej przeczytasz w artykule „ Typ application / x-www-form-urlencoded ” na Wikipedii.źródło
CGI.escape('Hello, this is me').gsub("+", "%20")
=> Hello%2C%20this%20is%20me"
jeśli nie chcesz używać żadnych klejnotówStworzyłem klejnot, aby kodowanie URI było czystsze do wykorzystania w kodzie. Dba o kodowanie binarne za Ciebie.
Uruchom
gem install uri-handler
, a następnie użyj:Dodaje funkcję konwersji URI do klasy String. Możesz również przekazać mu argument z opcjonalnym ciągiem kodowania, którego chcesz użyć. Domyślnie ustawia kodowanie „binarne”, jeśli proste kodowanie UTF-8 nie powiedzie się.
źródło
Kod:
Wynik:
źródło
Początkowo próbowałem uciec ze znaków specjalnych tylko w nazwie pliku, a nie w ścieżce, z pełnego ciągu adresu URL.
ERB::Util.url_encode
nie działa na mój użytek:Na podstawie dwóch odpowiedzi w „ Dlaczego URI.escape () jest oznaczona jako przestarzała i gdzie jest ta stała REGEXP :: UNSAFE? ”, Wygląda na to, że
URI::RFC2396_Parser#escape
jest lepsza niż używanieURI::Escape#escape
. Jednak oboje zachowują się wobec mnie tak samo:źródło
Jeśli chcesz „zakodować” pełny adres URL bez zastanawiania się nad ręcznym podzieleniem go na różne części, zauważyłem, że następujące elementy działają w taki sam sposób, jak wcześniej
URI.encode
:źródło