2016-01-31 2 views
1

Вот мой результат:URI кодирует не кодирующую URL-адрес (точение последних частей https: // в закодированные символы)

URI.encode("http://localhost:3000/membership?referer_invite_code=a03478&fee=UVYA") 
=> "http://localhost:3000/membership?referer_invite_code=a03478&fee=UVYA" 

But I need output to be: 
=> "http%3A%2F%2Flocalhost%3A3000..." 

Причина в том, что я пытаюсь сделать внедренную ссылку щебета и твиттер Безразлично» t хорошо справляется с амперсандами, поэтому, если кодировка не заменяет & для последнего параметра платы с %26, это не сработает. Как это исправить?

РАБОЧИЙ РАСТВОР

Rack::Utils.escape("http://localhost:3000/membership?referer_invite_code=a03478&fee=UVYA") 

Но я думаю, я просто любопытно, почему URI.encode не работает

ответ

0

Im предполагаю, что Вы забыли, прежде чем

require 'uri' 
1

Вы должны использовать URI.encode_www_form_component для вместо этого:

URI.encode_www_form_component "http://localhost:3000/membership?referer_invite_code=a03478&fee=UVYA" 
=> "http%3A%2F%2Flocalhost%3A3000%2Fmembership%3Freferer_invite_code%3Da03478%26fee%3DUVYA" 

кажется, что URI.encode предназначен для кодирования всего URI для использования в качестве URI, а не для использования в качестве параметра в URI. Он предназначен только для защиты от использования незаконных символов в URI - не для правильного кодирования параметров URI - поэтому по умолчанию он не кодирует зарезервированные символы, перечисленные here.

Дополнительную информацию можно найти на странице RubyDoc entry for URI::Escape. URI.escape принимает необязательное регулярное выражение в качестве второго аргумента. Регулярное выражение указывает, какие символы должны быть в процентах закодированы в результате. Если этот параметр опущен, используется значение по умолчанию URI::UNSAFE. В МРТ 2.3.1, это сводится к следующему:

/[^\-_.!~*'()a-zA-Z\d;\/?:@&=+$,\[\]]/

Как вы можете видеть, это не соответствует ни одному из зарезервированных символов для URI. Он будет защищать вас от создания и использования URI, который является незаконным. Например:

URI.encode "https://test.com" 
=> "https://test.com" 

URI.encode "https://testçĕÅ.com/" 
=> "https://test%C3%A7%C4%95%C3%85.com/" 
Смежные вопросы