Ruby相当于PHP urlencode

时间:2019-06-28 05:57:56

标签: ruby-on-rails ruby encoding iso-8859-1

我需要在Ruby中转换一个包含字符“ö”的URL。

在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 个答案:

答案 0 :(得分:8)

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 :(得分:1)

我找到了解决方法

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

=> "%F6"