복붙노트

[RUBY-ON-RAILS] 어떻게 URL에 루비에서 문자열을 인코딩

RUBY-ON-RAILS

어떻게 URL에 루비에서 문자열을 인코딩

I URI을 어떻게 :: 인코딩에게 문자열을 같은 :

\x12\x34\x56\x78\x9a\xbc\xde\xf1\x23\x45\x67\x89\xab\xcd\xef\x12\x34\x56\x78\x9a

같은 형식으로 얻을 수 있습니다 :

%124Vx%9A%BC%DE%F1%23Eg%89%AB%CD%EF%124Vx%9A

1738 RFC에 따라?

여기에 내가 뭘하려입니다 :

irb(main):123:0> URI::encode "\x12\x34\x56\x78\x9a\xbc\xde\xf1\x23\x45\x67\x89\xab\xcd\xef\x12\x34\x56\x78\x9a"
ArgumentError: invalid byte sequence in UTF-8
    from /usr/local/lib/ruby/1.9.1/uri/common.rb:219:in `gsub'
    from /usr/local/lib/ruby/1.9.1/uri/common.rb:219:in `escape'
    from /usr/local/lib/ruby/1.9.1/uri/common.rb:505:in `escape'
    from (irb):123
    from /usr/local/bin/irb:12:in `<main>'

또한:

irb(main):126:0> CGI::escape "\x12\x34\x56\x78\x9a\xbc\xde\xf1\x23\x45\x67\x89\xab\xcd\xef\x12\x34\x56\x78\x9a"
ArgumentError: invalid byte sequence in UTF-8
    from /usr/local/lib/ruby/1.9.1/cgi/util.rb:7:in `gsub'
    from /usr/local/lib/ruby/1.9.1/cgi/util.rb:7:in `escape'
    from (irb):126
    from /usr/local/bin/irb:12:in `<main>'

나는 인터넷에 대한 모든 것을보고 내가 저번에 내가 전혀 아무 문제없이 이런 짓을 거의 긍정적 인 생각하지만,이 작업을 수행 할 수있는 방법을 발견하지 않았습니다.

해결법

  1. ==============================

    1.

    require 'uri'
    str = "\x12\x34\x56\x78\x9a\xbc\xde\xf1\x23\x45\x67\x89\xab\xcd\xef\x12\x34\x56\x78\x9a".force_encoding('ASCII-8BIT')
    puts URI::encode(str)
    

    "URL에 루비의 문자열을 인코딩하는 방법"의 설명을 참조하십시오.

  2. ==============================

    2.요즘, 당신은 ERB :: Util.url_encode이나 이는 cgi를 사용해야합니다. 그들 사이의 가장 큰 차이점은 공간의 자신의 처리입니다 :

    요즘, 당신은 ERB :: Util.url_encode이나 이는 cgi를 사용해야합니다. 그들 사이의 가장 큰 차이점은 공간의 자신의 처리입니다 :

    >> ERB::Util.url_encode("foo/bar? baz&")
    => "foo%2Fbar%3F%20baz%26"
    
    >> CGI.escape("foo/bar? baz&")
    => "foo%2Fbar%3F+baz%26"
    

    이는 cgi는 CGI / HTML 형태의 사양을 다음 당신에게 ERB 반면 :: Util.url_encode 인코딩 할 것을 요구 RFC 3986을, 다음, 공간 +에 이스케이프 필요한 응용 프로그램 / x-www-form-urlencoded를 문자열을 제공합니다 20 %.

    "URI.escape하고 이는 cgi의 차이점은 무엇입니까?"를 참조 더 논의.

  3. ==============================

    3.

    str = "\x12\x34\x56\x78\x9a\xbc\xde\xf1\x23\x45\x67\x89\xab\xcd\xef\x12\x34\x56\x78\x9a"
    require 'cgi'
    CGI.escape(str)
    # => "%124Vx%9A%BC%DE%F1%23Eg%89%AB%CD%EF%124Vx%9A"
    

    J-ROU의 코멘트 @에서 촬영

  4. ==============================

    4.당신은 그것을 위해 어드레스로 :: URI 보석을 사용할 수 있습니다 :

    당신은 그것을 위해 어드레스로 :: URI 보석을 사용할 수 있습니다 :

    require 'addressable/uri'   
    string = '\x12\x34\x56\x78\x9a\xbc\xde\xf1\x23\x45\x67\x89\xab\xcd\xef\x12\x34\x56\x78\x9a'
    Addressable::URI.encode_component(string, Addressable::URI::CharacterClasses::QUERY)
    # "%5Cx12%5Cx34%5Cx56%5Cx78%5Cx9a%5Cxbc%5Cxde%5Cxf1%5Cx23%5Cx45%5Cx67%5Cx89%5Cxab%5Cxcd%5Cxef%5Cx12%5Cx34%5Cx56%5Cx78%5Cx9a" 
    

    그것은 이는 cgi보다, 예를 들어, 제대로 20 %로 공간을 인코딩하고 + 기호로, 당신은 위키 백과의 "응용 프로그램 /을 x-www-form-urlencoded 형식"에서 더 많은 읽을 수없는, 더 현대적인 형식을 사용합니다.

    2.1.2 :008 > CGI.escape('Hello, this is me')
     => "Hello%2C+this+is+me" 
    2.1.2 :009 > Addressable::URI.encode_component('Hello, this is me', Addressable::URI::CharacterClasses::QUERY)
     => "Hello,%20this%20is%20me" 
    
  5. ==============================

    5.난 당신의 코드에서 사용 URI 인코딩 물건 청소기를 만들기 위해 보석을 만들었습니다. 그것은 당신을 위해 바이너리 인코딩을 처리합니다.

    난 당신의 코드에서 사용 URI 인코딩 물건 청소기를 만들기 위해 보석을 만들었습니다. 그것은 당신을 위해 바이너리 인코딩을 처리합니다.

    실행 보석 URI 핸들러를 설치 한 후 사용

    require 'uri-handler'
    
    str = "\x12\x34\x56\x78\x9a\xbc\xde\xf1\x23\x45\x67\x89\xab\xcd\xef\x12\x34\x56\x78\x9a".to_uri
    # => "%124Vx%9A%BC%DE%F1%23Eg%89%AB%CD%EF%124Vx%9A"
    

    그것은 String 클래스에 URI 변환 기능을 추가합니다. 당신은 또한 당신이 사용하고자하는 옵션 인코딩 문자열 인수를 전달할 수 있습니다. 기본적으로는 직선 UTF-8 인코딩이 실패 할 경우 인코딩 '진'으로 설정합니다.

  6. ==============================

    6.암호:

    암호:

    str = "http://localhost/with spaces and spaces"
    encoded = URI::encode(str)
    puts encoded
    

    결과:

    http://localhost/with%20spaces%20and%20spaces
    
  7. ==============================

    7.나는 원래 전체 URL 문자열에서 만이 아닌 경로에 파일 이름에 특수 문자를 탈출하려고했다.

    나는 원래 전체 URL 문자열에서 만이 아닌 경로에 파일 이름에 특수 문자를 탈출하려고했다.

    ERB :: Util.url_encode 내 사용을 위해 작동하지 않았다 :

    helper.send(:url_encode, "http://example.com/?a=\11\15")
    # => "http%3A%2F%2Fexample.com%2F%3Fa%3D%09%0D"
    

    두 답변을 바탕으로 "왜 오래된 어디에로 표시 URI.escape ()입니다 것은이 정규 표현식 :: 안전하지 않은 상수?", 그것은이다 더 나은 URI :: 탈출 # 이스케이프를 사용하는 것보다 URI :: RFC2396_Parser 번호 탈출 것 같습니다. 그러나, 그들은 모두 나에게 같은 행동을하고 있습니다 :

    URI.escape("http://example.com/?a=\11\15")
    # => "http://example.com/?a=%09%0D"
    URI::Parser.new.escape("http://example.com/?a=\11\15")
    # => "http://example.com/?a=%09%0D"
    
  8. ==============================

    8.당신이 다른 부분에 수동으로 분할을 생각하지 않고 전체 URL "인코딩"을 원하는 경우, 나는이 내가 URI.encode을 사용하는 데 사용되는 것과 같은 방식으로 일을 다음과 발견 :

    당신이 다른 부분에 수동으로 분할을 생각하지 않고 전체 URL "인코딩"을 원하는 경우, 나는이 내가 URI.encode을 사용하는 데 사용되는 것과 같은 방식으로 일을 다음과 발견 :

    URI.parse(my_url).to_s
    
  9. from https://stackoverflow.com/questions/6714196/how-to-url-encode-a-string-in-ruby by cc-by-sa and MIT license