See RFC 3986, section 3.3 for allowed path characters.

Methods
S
T
Included Modules
Instance Public methods
setup()
# File actionpack/test/controller/routing_test.rb, line 17
def setup
  @set = ActionDispatch::Routing::RouteSet.new
  @set.draw do
    match ':controller/:action/:variable/*additional'
  end

  safe, unsafe = %w(: @ & = + $ , ;), %w(^ ? # [ ])
  hex = unsafe.map { |char| '%' + char.unpack('H2').first.upcase }

  @segment = "#{safe.join}#{unsafe.join}".freeze
  @escaped = "#{safe.join}#{hex.join}".freeze
end
test_route_generation_allows_passing_non_string_values_to_generated_helper()
# File actionpack/test/controller/routing_test.rb, line 48
def test_route_generation_allows_passing_non_string_values_to_generated_helper
  assert_equal "/content/action/variable/1/2",
    url_for(@set, {
      :controller => "content",
      :action => "action",
      :variable => "variable",
      :additional => [1, 2]
    })
end
test_route_generation_escapes_unsafe_path_characters()
# File actionpack/test/controller/routing_test.rb, line 30
def test_route_generation_escapes_unsafe_path_characters
  assert_equal "/content/act#{@escaped}ion/var#{@escaped}iable/add#{@escaped}itional-1/add#{@escaped}itional-2",
    url_for(@set, {
      :controller => "content",
      :action => "act#{@segment}ion",
      :variable => "var#{@segment}iable",
      :additional => ["add#{@segment}itional-1", "add#{@segment}itional-2"]
    })
end
test_route_recognition_unescapes_path_components()
# File actionpack/test/controller/routing_test.rb, line 40
def test_route_recognition_unescapes_path_components
  options = { :controller => "content",
              :action => "act#{@segment}ion",
              :variable => "var#{@segment}iable",
              :additional => "add#{@segment}itional-1/add#{@segment}itional-2" }
  assert_equal options, @set.recognize_path("/content/act#{@escaped}ion/var#{@escaped}iable/add#{@escaped}itional-1/add#{@escaped}itional-2")
end