Короткий ответ: кодирование строки Ruby
Издание 2024 года:
1
URI::Parser.new.escape(my_url_string)
Там уже полный вопрос о переполнении стека по этому поводу, но похоже, что из Ruby 3 единственная рабочая версия (без тяжелых твиков) – та, что описана выше.
Полный пример:
1
2
3
4
5
6
7
8
require 'uri'
my_string = "hello world"
my_url_string = "https://somedomain.com?word=#{my_string}"
URI::Parser.new.escape(my_url_string)
# => "https://somedomain.com?word=hello%20world"
Угловой регистр: неэкранированные символы
Однако когда вы пытаетесь передать кавычку, это не работает:
1
2
3
4
5
6
7
require 'uri'
my_string = "hello?world"
my_url_string = "https://somedomain.com?word=#{my_string}"
URI::Parser.new.escape(my_url_string)
# => "https://somedomain.com?word=hello?world"
Это требует небольшого взлома .gsub('?', '%3F')
1
2
3
4
5
6
7
require 'uri'
my_string = "hello?world"
my_url_string = "https://somedomain.com?word=#{my_string.gsub('?', '%3F')}"
URI::Parser.new.escape(my_url_string)
# => "https://somedomain.com?word=hello%253Fworld"
Почему маленький хак? Ну, у меня не было времени, чтобы глубоко погрузиться в escape
Однако я предполагаю, что, учитывая тот факт, что кавычка уже является частью обычного URL (это разделитель строки запроса), этот символ не кодируется.
Итак, давайте подтолкнем это предположение, попытавшись закодировать ://
(Я оставил эту часть в качестве упражнения 🙂
…
Хорошо, они не закодированы. Это подводит меня к последнему абзацу.
Надежность кодирования URL-строки в Ruby
Я пробовал и другие методы, но этот определенно работает сейчас. Я намеренно упомянул год в названии темы, потому что не совсем уверен, что этот ответ будет действителен, скажем, через 2 или 3 года, но на данный момент это определенно самый надежный способ, который я нашел (так что далеко).
Помимо персонажей, которые на самом деле принадлежат обычному URL-адресу, других сложных вещей я не нашел.
В зависимости от варианта использования экранирование этих символов может быть хорошей или плохой идеей.
Заключение
В этом выводе нет ничего особенного, я только надеюсь, что вы выиграли сегодня 5 минут благодаря этой статье 🙂
Лучший,
Дэйвид.
2024-01-25 11:59:49
1706491321
#Как #закодировать #строку #URL #Ruby