ইউএসএল কিভাবে রুবিতে একটি স্ট্রিং এনকোড করবে


135

আমি কীভাবে 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

আরএফসি 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>'

আমি ইন্টারনেট সম্পর্কে সমস্ত কিছু অনুসন্ধান করেছি এবং এটি করার কোনও উপায় খুঁজে পাইনি, যদিও আমি প্রায় ইতিবাচক যে অন্য দিন আমি কোনও ঝামেলা ছাড়াই এটি করেছি।


1
রুবি ১.৯ ব্যবহার করলে সম্ভবত দরকারী: ইয়াহুডাকটজ.com
2010

উত্তর:


179
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"

2
force_encoding('binary')আরও বেশি স্ব-ডকুমেন্টিং পছন্দ হতে পারে।
মিউ খুব ছোট

63
তারা সেই পদ্ধতিটিকে অবমূল্যায়ন করেছে, CGI.escapeপরিবর্তে * * ব্যবহার করুন। -> http://www.ruby-forum.com/topic/207489#903709 । আপনার URI.www_form_encode* URI.www_form_encode_component* ব্যবহার করতে সক্ষম হওয়া উচিত , তবে আমি সেগুলি কখনও ব্যবহার করি নি
জে-রউ

2
require 'open-uri'এখানে দরকার নেই। মানে require 'uri'?
pje

1
@ জে-রউ, সিজিআই.এসস্কেপ পুরো ইউআরএল এড়াতে পারে, এটি কোয়েরি প্যারামিটারগুলি বেছে বেছে পলায়ন করে না, উদাহরণস্বরূপ, আপনি যদি 'a=&!@&b=&$^'সিজিআই.সেস্কেপ পাস করেন তবে এটি ক্যোয়ারী বিভাজকগুলির সাথে পুরো জিনিসটি পালিয়ে যাবে সুতরাং এটি &কেবলমাত্র মানগুলি অনুসন্ধান করার জন্য ব্যবহার করা যেতে পারে। আমি addressableমণি ব্যবহার করার পরামর্শ দিচ্ছি , এটি ইউআরএল নিয়ে কাজ করা আরও বৌদ্ধিক।
আলেকজান্ডার.লিজুশকিন

আমার রিমোট সার্ভারে ফাইল অ্যাক্সেস করা দরকার। সিজিআই সহ এনকোডিং কাজ করেনি, তবে ইউআরআই.এনকোড কাজটি ঠিকঠাকভাবে করেছে।
ট্যাশস

82

আজকাল, আপনার ব্যবহার করা উচিত 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সিজিআই / এইচটিএমএল ফর্মগুলিকে অনুসরণ করে এবং আপনাকে একটি application/x-www-form-urlencodedস্ট্রিং দেয় , যার জন্য ফাঁকা স্থানগুলি রক্ষা পাওয়ার প্রয়োজন হয় +, আরএফসি 3986ERB::Util.url_encode অনুসরণ করে , যার জন্য এগুলি এনকোড করা দরকার ।%20

দেখুন " কি URI.escape এবং CGI.escape? পার্থক্য আরো আলোচনার জন্য"।


70
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"

@ জে-রু এর মন্তব্য থেকে নেওয়া


11

আপনি তার জন্য 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এবং +চিহ্ন হিসাবে না , আপনি উইকিপিডিয়ায় " অ্যাপ্লিকেশন / এক্স-www-ফর্ম-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" 

এটি এর মতোও করতে পারেন: CGI.escape('Hello, this is me').gsub("+", "%20") => Hello%2C%20this%20is%20me"যদি কোনও রত্ন ব্যবহার করতে না চান
র্যাকুন

5

আপনার কোডটিতে ইউআরআই এনকোডিং স্টাফ ক্লিনার হিসাবে তৈরি করার জন্য আমি একটি রত্ন তৈরি করেছি। এটি আপনার জন্য বাইনারি এনকোডিংয়ের যত্ন নেয়।

চালান 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"

এটি স্ট্রিং ক্লাসে ইউআরআই রূপান্তর কার্যকারিতা যুক্ত করে। আপনি এটি ব্যবহার করতে চান এমন alচ্ছিক এনকোডিং স্ট্রিং সহ এটি একটি আর্গুমেন্টও পাস করতে পারেন। ডিফল্টরূপে এটি 'বাইনারি' এনকোডিংয়ের জন্য সেট করে যদি সরাসরি UTF-8 এনকোডিং ব্যর্থ হয়।


2

কোড:

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

ফলাফল:

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

যদি প্রাপ্তি সার্ভারটি পুরানো হয় তবে এটি সিজিআই.এসকেপে ভাল উত্তর দিতে পারে না। এটি এখনও একটি বৈধ বিকল্প।
সিজার্টাল্ভস

2

আমি পুরো URL স্ট্রিং থেকে মূলত কেবল একটি ফাইলের নামে বিশেষ অক্ষরগুলি পালানোর চেষ্টা করছিলাম path

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::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"

2

আপনি যদি এটির বিভিন্ন অংশে ম্যানুয়ালি বিভক্ত হওয়ার কথা চিন্তা না করেই একটি সম্পূর্ণ URL "এনকোড" করতে চান তবে নীচেরগুলি আমি যেভাবে ব্যবহার করেছি সেভাবে কাজ করেছি URI.encode:

URI.parse(my_url).to_s
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.