Рубиновый эквивалент PHP-кода urlencode - PullRequest
0 голосов
/ 28 июня 2019

Мне нужно преобразовать URL-адрес в Ruby, содержащий символ «ö».

В PHP urlencode возвращает% F6 для ö, который представляется шестнадцатеричным значением для «ö» в ISO 8859.

Я пробовал несколько разных методов, но ни один из них не возвращал правильный символ:

  • CGI.escape 'ö' ->% C3% B6
  • URI.encode'o' ->% C3% B6
  • ERB :: Util.url_encode 'ö' ->% C3% B6
  • 'ö'.force_encoding (' iso-8859-1 ')-> \ xC3 \ xB

Какой метод следует использовать для получения желаемого результата?

-e-

Дополнительное требование:

Мне нужно только конвертировать эти символы в пути URL.Двоеточие, косая черта и т. Д. Должны оставаться неизменными:

http://example.com/this/is/an/ö

будет

http://example.com/this/is/an/%F6

Ответы [ 2 ]

8 голосов
/ 28 июня 2019

Ruby по умолчанию использует строки UTF-8:

str = 'ö'

str.encoding
#=> #<Encoding:UTF-8>

Если вам нужна строка в Ruby в кодировке ISO 8859, вы должны преобразовать ее:

str.encode('ISO-8859-1')
#=> "\xF6"

в URL-кодировать строку, есть CGI.escape:

require 'cgi'

CGI.escape(str.encode('ISO-8859-1'))
#=> "%F6"

для кодирования URL, используйте URI.escape:

require 'uri'

url = 'http://example.com/this/is/an/ö'
URI.escape(url.encode('ISO-8859-1'))
#=> "http://example.com/this/is/an/%F6"
1 голос
/ 28 июня 2019

Я нашел решение

converter = Encoding::Converter.new("utf-8", "iso-8859-1")
CGI.escape(converter.convert('ö'))

=> "%F6"
...