루비에서 문자열을 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.escape
CGI/HTML 양식 사양을 따르고 다음을 제공합니다.application/x-www-form-urlencoded
문자열. 공백을 이스케이프해야 합니다.+
,반면에.ERB::Util.url_encode
RFC 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
'source' 카테고리의 다른 글
스프링 부트 JAR의 BOOT-INF 및 META-INF 디렉토리는 무엇입니까? (0) | 2023.07.06 |
---|---|
시스템을 사용하여 메모리에 ZIP 아카이브 만들기IO.압축 (0) | 2023.07.06 |
Visual Studio 2013에서 TypeScript를 사용하는 방법 (0) | 2023.07.06 |
작업입니다.ASP.NET MVC 웹 응용 프로그램에서 잘못된 것으로 간주되는 관행을 실행하시겠습니까? (0) | 2023.07.06 |
확인하지 못했습니다. com.google.파이어베이스:파이어베이스-코어:11.2.0 (0) | 2023.07.06 |