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..."
Причина в том, что я пытаюсь создать встроенную ссылку на твиттер, а твиттер плохо справляется с амперсандами, так что пока кодировка не заменяет &
для последнего параметра оплаты с %26
это не сработает. Как это исправить?
РАБОЧЕЕ РЕШЕНИЕ
Rack::Utils.escape("http://localhost:3000/membership?referer_invite_code=a03478&fee=UVYA")
Но я думаю, мне просто любопытно, почему URI.encode
не работал
2 ответа
Вы должны использовать 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 - поэтому по умолчанию он не кодирует зарезервированные символы, перечисленные здесь.
Вы можете найти больше информации в записи RubyDoc для 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/"