Bagaimana URI::encode
cara string seperti:
\x12\x34\x56\x78\x9a\xbc\xde\xf1\x23\x45\x67\x89\xab\xcd\xef\x12\x34\x56\x78\x9a
untuk mendapatkannya dalam format seperti:
%124Vx%9A%BC%DE%F1%23Eg%89%AB%CD%EF%124Vx%9A
sesuai RFC 1738?
Inilah yang saya coba:
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>'
Juga:
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>'
Saya mencari semua tentang internet dan belum menemukan cara untuk melakukan ini, walaupun saya hampir positif bahwa beberapa hari yang lalu saya melakukan ini tanpa masalah sama sekali.
Jawaban:
sumber
force_encoding('binary')
mungkin menjadi pilihan yang lebih banyak mendokumentasikan diri.CGI.escape
sebaliknya menggunakan * *. -> http://www.ruby-forum.com/topic/207489#903709 . Anda juga harus dapat menggunakanURI.www_form_encode
*URI.www_form_encode_component
*, tetapi saya tidak pernah menggunakan iturequire 'open-uri'
sini. Apakah maksud Andarequire 'uri'
?'a=&!@&b=&$^'
ke CGI.escape itu akan lolos semuanya dengan pemisah kueri&
sehingga ini hanya dapat digunakan untuk nilai kueri. Saya sarankan menggunakanaddressable
permata, itu lebih intelektual bekerja dengan url.Saat ini, Anda harus menggunakan
ERB::Util.url_encode
atauCGI.escape
. Perbedaan utama di antara mereka adalah penanganan ruang mereka:CGI.escape
mengikuti spec formulir CGI / HTML dan memberi Anda sebuahapplication/x-www-form-urlencoded
string, yang membutuhkan spasi untuk melarikan diri+
, sedangkanERB::Util.url_encode
mengikuti RFC 3986 , yang mengharuskan mereka untuk dikodekan sebagai%20
.Lihat " Apa perbedaan antara URI.escape dan CGI.escape? " Untuk diskusi lebih lanjut.
sumber
Diambil dari komentar @ J-Rou
sumber
Anda dapat menggunakan
Addressable::URI
permata untuk itu:Ini menggunakan format yang lebih modern, daripada
CGI.escape
, misalnya, itu benar menyandikan ruang sebagai%20
dan bukan sebagai+
tanda, Anda dapat membaca lebih lanjut di " Jenis aplikasi / x-www-form-urlencoded " di Wikipedia.sumber
CGI.escape('Hello, this is me').gsub("+", "%20")
=> Hello%2C%20this%20is%20me"
jika tidak ingin menggunakan permataSaya membuat permata untuk membuat penyandian URI lebih bersih untuk digunakan dalam kode Anda. Ini menangani pengodean biner untuk Anda.
Jalankan
gem install uri-handler
, lalu gunakan:Itu menambahkan fungsi konversi URI ke dalam kelas String. Anda juga bisa memberikan argumen dengan string penyandian opsional yang ingin Anda gunakan. Secara default ia mengatur ke encoding 'binary' jika pengkodean lurus UTF-8 gagal.
sumber
Kode:
Hasil:
sumber
Awalnya saya mencoba melarikan diri karakter khusus hanya dalam nama file, bukan di jalur, dari string URL lengkap.
ERB::Util.url_encode
tidak berfungsi untuk saya gunakan:Berdasarkan dua jawaban di " Mengapa URI.escape () ditandai sebagai usang dan di mana REGEXP :: UNSAFE ini konstan? ", Sepertinya
URI::RFC2396_Parser#escape
lebih baik daripada menggunakanURI::Escape#escape
. Namun, mereka berdua berperilaku sama dengan saya:sumber
Jika Anda ingin "menyandikan" URL lengkap tanpa harus memikirkan membelahnya secara manual menjadi bagian-bagian yang berbeda, saya menemukan yang berikut ini berfungsi dengan cara yang sama seperti yang saya gunakan
URI.encode
:sumber