Saya mengharapkan
System.out.println(java.net.URLEncoder.encode("Hello World", "UTF-8"));
untuk output:
Hello%20World
(20 adalah kode ASCII Hex untuk spasi)
Namun, yang saya dapatkan adalah:
Hello+World
Apakah saya menggunakan metode yang salah? Apa metode yang benar yang harus saya gunakan?
Jawaban:
Ini berperilaku seperti yang diharapkan. The
URLEncoder
alat Spesifikasi HTML untuk bagaimana encode URL dalam bentuk HTML.Dari javadocs :
dan dari Spesifikasi HTML :
Anda harus menggantinya, misalnya:
sumber
t.println(java.net.URLEncoder.encode("Hello World", "UTF-8").replace("\\+", "%20"));
Sebuah ruang dikodekan ke
%20
dalam URL, dan ke+
dalam formulir yang dikirimkan data (aplikasi tipe konten / x-www-form-urlencoded). Anda membutuhkan yang pertama.Menggunakan jambu biji :
Anda dapat menggunakan UrlEscapers :
Jangan gunakan String.replace, ini hanya akan menyandikan ruang. Gunakan perpustakaan sebagai gantinya.
sumber
Kelas ini melakukan
application/x-www-form-urlencoded
-type encoding daripada persen encoding, oleh karena itu menggantidengan
+
adalah perilaku yang benar.Dari javadoc:
sumber
url
, ruang harus ditafsirkan sebagai%20
. Jadi yang perlu kita lakukanurl.replaceAll("\\+", "%20")
? Dan jika itu javascript, kita seharusnya tidak menggunakanescape
fungsi. GunakanencodeURI
atauencodeURIComponent
sebagai gantinya. Itulah yang saya pikir.Encode parery Query
ATAU jika Anda ingin melarikan diri karakter dalam URI
sumber
org.apache.commons.httpclient.util.URIUtil
tampaknya menjadi cara paling efisien untuk menyelesaikan masalah!Hello+World
adalah cara browser akan menyandikan data formulir (application/x-www-form-urlencoded
) untukGET
permintaan dan ini adalah formulir yang diterima secara umum untuk bagian permintaan URI.Jika Anda mengirim permintaan ini ke servlet Java, servlet akan dengan benar mendekode nilai parameter. Biasanya satu-satunya waktu ada masalah di sini adalah jika pengkodean tidak cocok.
Sebenarnya, tidak ada persyaratan dalam spesifikasi HTTP atau URI bahwa bagian kueri yang akan dikodekan menggunakan
application/x-www-form-urlencoded
pasangan nilai kunci; bagian permintaan hanya perlu dalam bentuk yang diterima server web. Dalam praktiknya, ini tidak mungkin menjadi masalah.Biasanya tidak benar menggunakan pengkodean ini untuk bagian lain dari URI (jalur misalnya). Dalam hal ini, Anda harus menggunakan skema penyandian seperti yang dijelaskan dalam RFC 3986 .
Lebih lanjut di sini .
sumber
Jawaban lain baik menghadirkan penggantian string manual, URLEncoder yang sebenarnya menyandikan untuk format HTML, URIUtil ditinggalkan Apache , atau menggunakan UrlEscapers Guava . Yang terakhir baik-baik saja, kecuali tidak memberikan decoder.
Apache Commons Lang menyediakan URLCodec , yang mengkodekan dan mendekode sesuai dengan format URL rfc3986 .
Jika Anda sudah menggunakan Spring, Anda juga dapat memilih untuk menggunakan nya kelas UriUtils .
sumber
"+" benar. Jika Anda benar-benar membutuhkan% 20, ganti Plusses sendiri setelahnya.
sumber
+
karakter dalam teks asli seharusnya dikodekan sebagai%2B
.+
itu benar tanpa mengetahui konteksnya, setidak-tidaknya, menyolok. Diturunkan. Baca jawaban lain untuk mengetahui kapan + atau% 20 akan digunakan.Baru saja berjuang dengan ini juga di Android, berhasil menemukan Uri.encode (String, String) sementara khusus untuk android (android.net.Uri) mungkin berguna bagi sebagian orang.
encode String statis (String s, String memungkinkan)
https://developer.android.com/reference/android/net/Uri.html#encode(java.lang.String, java.lang.String)
sumber
Ini berhasil untuk saya
sumber
Meski cukup tua, namun respon cepat:
Spring menyediakan UriUtils - dengan ini Anda dapat menentukan cara menyandikan dan bagian mana yang terkait dengan URI, mis.
Saya menggunakannya karena kami sudah menggunakan Spring, yaitu tidak ada perpustakaan tambahan yang diperlukan!
sumber
Lihatlah kelas java.net.URI.
sumber
Ya, metode ini java.net.URLEncoder.encode tidak dibuat untuk mengonversi "" menjadi "20%" sesuai dengan spesifikasi ( sumber ).
Meskipun ini bukan metode yang benar, Anda dapat memodifikasi ini untuk:
System.out.println(java.net.URLEncoder.encode("Hello World", "UTF-8").replaceAll("\\+", "%20"));
have a nice day =).sumber
URLEncoder.encode
) dan menambalnya menggunakanreplaceAll
yang hanya akan bekerja dalam kasus khusus ini. Gunakan kelas dan metode yang benar sebagai gantinya, lihat jawaban lain.GUNAKAN MyUrlEncode.URLencoding (String url, String enc) untuk menangani masalah
sumber
gunakan set karakter "
ISO-8859-1
" untuk URLEncodersumber