Как мне URI::encode
строку вроде:
\x12\x34\x56\x78\x9a\xbc\xde\xf1\x23\x45\x67\x89\xab\xcd\xef\x12\x34\x56\x78\x9a
чтобы получить его в формате как:
%124Vx%9A%BC%DE%F1%23Eg%89%AB%CD%EF%124Vx%9A
согласно RFC 1738?
Вот что я попробовал:
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>'
Также:
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>'
Я посмотрел все об Интернете и не нашел способа сделать это, хотя я почти уверен, что на днях я сделал это без каких-либо проблем.
Ответы:
источник
force_encoding('binary')
может быть более самодокументированным выбором.CGI.escape
вместо этого используйте * *. -> http://www.ruby-forum.com/topic/207489#903709 . Вы также должны быть в состоянии использоватьURI.www_form_encode
*URI.www_form_encode_component
*, но я никогда не использовал ихrequire 'open-uri'
здесь. Вы имели в видуrequire 'uri'
?'a=&!@&b=&$^'
CGI.escape, он будет экранировать все с разделителями запросов,&
поэтому его можно использовать только для запроса значений. Я предлагаю использоватьaddressable
gem, это более интеллектуальная работа с URL.В настоящее время вы должны использовать
ERB::Util.url_encode
илиCGI.escape
. Основное различие между ними заключается в их обработке пробелов:CGI.escape
следует спецификации форм CGI / HTML и дает вамapplication/x-www-form-urlencoded
строку, для которой требуется экранирование пробелов+
, тогда какERB::Util.url_encode
следует RFC 3986 , которая требует, чтобы они были закодированы как%20
.См. «В чем разница между URI.escape и CGI.escape? » Для дальнейшего обсуждения.
источник
Взято из комментария @ J-Rou
источник
Вы можете использовать
Addressable::URI
гем для этого:Он использует более современный формат, чем
CGI.escape
, например, он правильно кодирует пространство как,%20
а не как+
знак, вы можете прочитать больше в " Тип application / x-www-form-urlencoded " в Википедии.источник
CGI.escape('Hello, this is me').gsub("+", "%20")
=> Hello%2C%20this%20is%20me"
если не хотите использовать какие-либо драгоценные камниЯ создал гем, чтобы сделать кодировку URI более чистой для использования в вашем коде. Он заботится о бинарном кодировании для вас.
Запустите
gem install uri-handler
, затем используйте:Он добавляет функциональность преобразования URI в класс String. Вы также можете передать ему аргумент с необязательной строкой кодирования, которую вы хотели бы использовать. По умолчанию он устанавливает кодировку «двоичный», если прямая кодировка UTF-8 не удалась.
источник
Код:
Результат:
источник
Первоначально я пытался экранировать специальные символы только в имени файла, а не в пути, из полной строки URL.
ERB::Util.url_encode
не работал для моего использования:Основываясь на двух ответах в « Почему URI.escape () помечен как устаревший и где эта константа REGEXP :: UNSAFE? », Это выглядит
URI::RFC2396_Parser#escape
лучше, чем использованиеURI::Escape#escape
. Тем не менее, они оба ведут себя одинаково для меня:источник
Если вы хотите «закодировать» полный URL-адрес, не думая о том, чтобы вручную разбить его на разные части, я обнаружил, что следующее работает так же, как и раньше
URI.encode
:источник