Wie mag ich URI::encode
einen String wie:
\x12\x34\x56\x78\x9a\xbc\xde\xf1\x23\x45\x67\x89\xab\xcd\xef\x12\x34\x56\x78\x9a
um es in einem Format wie:
%124Vx%9A%BC%DE%F1%23Eg%89%AB%CD%EF%124Vx%9A
gemäß RFC 1738?
Folgendes habe ich versucht:
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>'
Ebenfalls:
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>'
Ich habe mich im Internet umgesehen und keinen Weg gefunden, dies zu tun, obwohl ich fast sicher bin, dass ich dies neulich ohne Probleme getan habe.
Antworten:
quelle
force_encoding('binary')
könnte eine selbstdokumentierendere Wahl sein.CGI.escape
stattdessen * * verwendet. -> http://www.ruby-forum.com/topic/207489#903709 . Sie sollten auch in der Lage sein,URI.www_form_encode
*URI.www_form_encode_component
* zu verwenden, aber ich habe diese nie verwendetrequire 'open-uri'
hier. Meinten Sierequire 'uri'
?'a=&!@&b=&$^'
maskieren. Es werden keine selektiven Abfrageparameter maskiert. Wenn Sie beispielsweise an CGI.escape übergeben, wird das Ganze mit Abfragetrennzeichen maskiert,&
sodass dies nur zum Abfragen von Werten verwendet werden kann. Ich schlage vor,addressable
gem zu verwenden, es ist intellektueller, mit URLs zu arbeiten.Heutzutage sollten Sie
ERB::Util.url_encode
oder verwendenCGI.escape
. Der Hauptunterschied zwischen ihnen ist der Umgang mit Räumen:CGI.escape
folgt der CGI / HTML-Formularspezifikation und gibt Ihnen eineapplication/x-www-form-urlencoded
Zeichenfolge, für die Leerzeichen maskiert werden müssen+
, während RFC 3986ERB::Util.url_encode
folgt , für die sie codiert werden müssen .%20
Weitere Informationen finden Sie unter " Was ist der Unterschied zwischen URI.escape und CGI.escape? ".
quelle
Entnommen aus dem Kommentar von @ J-Rou
quelle
Sie können
Addressable::URI
Edelstein dafür verwenden:Es verwendet ein moderneres Format, als es
CGI.escape
beispielsweise den Speicherplatz ordnungsgemäß%20
als+
Zeichen und nicht als Zeichen codiert. Weitere Informationen finden Sie unter " Die Anwendung / x-www-form-urlencoded type " auf Wikipedia.quelle
CGI.escape('Hello, this is me').gsub("+", "%20")
=> Hello%2C%20this%20is%20me"
wenn du keine Edelsteine verwenden willstIch habe ein Juwel erstellt, um die URI-Codierung für die Verwendung in Ihrem Code sauberer zu gestalten. Es kümmert sich um die binäre Codierung für Sie.
Führen Sie aus
gem install uri-handler
und verwenden Sie dann:Es fügt die URI-Konvertierungsfunktion der String-Klasse hinzu. Sie können ihm auch ein Argument mit der optionalen Codierungszeichenfolge übergeben, die Sie verwenden möchten. Standardmäßig ist die Codierung "binär" eingestellt, wenn die direkte UTF-8-Codierung fehlschlägt.
quelle
Code:
Ergebnis:
quelle
Ich habe ursprünglich versucht, Sonderzeichen nur in einem Dateinamen und nicht im Pfad aus einer vollständigen URL-Zeichenfolge zu entfernen.
ERB::Util.url_encode
hat für meinen Gebrauch nicht funktioniert:Basierend auf zwei Antworten in " Warum ist URI.escape () als veraltet markiert und wo ist diese REGEXP :: UNSAFE-Konstante? " Scheint es
URI::RFC2396_Parser#escape
besser zu sein als zu verwendenURI::Escape#escape
. Beide verhalten sich für mich jedoch gleich:quelle
Wenn Sie eine vollständige URL "verschlüsseln" möchten, ohne darüber nachdenken zu müssen, sie manuell in ihre verschiedenen Teile aufzuteilen, habe ich festgestellt, dass Folgendes auf die gleiche Weise funktioniert wie früher
URI.encode
:quelle