source

루비에서 문자열을 URL 인코딩하는 방법

lovecheck 2023. 7. 6. 22:20
반응형

루비에서 문자열을 URL 인코딩하는 방법

어떻게 하면 좋을까요?URI::encode다음과 같은 문자열:

\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

RFC 1738에 따라?

제가 시도한 것은 다음과 같습니다.

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>'

저는 인터넷에 대해 모든 것을 찾아봤지만, 얼마 전에는 아무런 문제 없이 이 일을 했다는 것을 거의 확신합니다.

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 CGI.escape str


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

요즘에는, 당신은 사용해야 합니다.ERB::Util.url_encode또는CGI.escape이들 사이의 주요 차이점은 공간 처리입니다.

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

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

CGI.escapeCGI/HTML 양식 사양을 따르고 다음을 제공합니다.application/x-www-form-urlencoded문자열. 공백을 이스케이프해야 합니다.+,반면에.ERB::Util.url_encodeRFC 3986을 따르며, RFC 3986은 다음과 같이 인코딩되어야 합니다.%20.

자세한 내용은 "URI.escape와 CGI.escape의 차이점은 무엇입니까?"를 참조하십시오.

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의 논평에서 따옴.

원래는 전체 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()가 구식으로 표시된 이유와 이 REGEXP::UNSAFE 상수는 어디에 있습니까?"의 두 가지 대답을 기준으로 하면 다음과 같습니다.URI::RFC2396_Parser#escape사용하는 것보다 더 좋습니다.URI::Escape#escape하지만, 그들은 둘 다 저에게 똑같이 행동하고 있습니다.

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"

사용할 수 있습니다.Addressable::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.escape예를 들어, 그것은 공간을 적절하게 인코딩합니다.%20이 아닌+sign, 위키백과의 "application/x-www-form-urlenced type"에서 더 많은 내용을 읽을 수 있습니다.

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" 

코드:

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

결과:

http://localhost/with%20spaces%20and%20spaces

나는 당신의 코드에서 URI 인코딩을 더 깨끗하게 하기 위해 보석을 만들었습니다.이진 인코딩을 처리합니다.

달려.gem install uri-handler다음을 사용합니다.

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"

URI 변환 기능을 String 클래스에 추가합니다.사용할 선택적 인코딩 문자열을 사용하여 인수를 전달할 수도 있습니다.기본적으로 직선 UTF-8 인코딩이 실패할 경우 '이진' 인코딩으로 설정됩니다.

수동으로 URL을 여러 부분으로 분할할 필요 없이 전체 URL을 "인코딩"하려면 다음과 같은 방법으로 작동한다는 것을 알게 되었습니다.URI.encode:

URI.parse(my_url).to_s

언급URL : https://stackoverflow.com/questions/6714196/how-to-url-encode-a-string-in-ruby

반응형