java.net.URLEncoder.encode (String) sudah usang, apa yang harus saya gunakan?

192

Saya mendapatkan peringatan berikut saat menggunakan java.net.URLEncoder.encode:

peringatan: [deprecation] encode (java.lang.String)
         di java.net.URLEncoder telah ditinggalkan

Apa yang harus saya gunakan?

Frank Krueger
sumber
23
Ini dijawab dalam tag penghentian dalam dokumen: "Sebaliknya, gunakan metode encode (String, String) untuk menentukan pengkodean." Lihat java.sun.com/javase/6/docs/api/java/net/URLEncoder.html .
Michael Myers

Jawaban:

278

Gunakan encodemetode lain di URLEncoder :

URLEncoder.encode(String, String)

Parameter pertama adalah teks yang akan dikodekan; yang kedua adalah nama pengkodean karakter untuk digunakan (misalnya, UTF-8). Sebagai contoh:

System.out.println(
  URLEncoder.encode(
    "urlParameterString",
    java.nio.charset.StandardCharsets.UTF_8.toString()
  )
);
Will Wagner
sumber
14
@ jsh: Saya bingung, mengapa tidak ada URLDecoder? Mengapa ini membuat Java kembung? Ini adalah metode statis. Perlu usaha yang sama untuk mengetik. Jika Anda suka Python, mengapa Anda pemrograman di Jawa? Apakah karena lebih banyak orang menggunakan Java daripada Python dan Anda mendapat pekerjaan Java daripada pekerjaan Python?
stepanian
10
Dia menyebutnya gembung karena terlalu padatnya namespace kelas global. Mengapa URLEncoder.encode dan URLDecoder.decode ketika Anda bisa memiliki URL.encode dan URL.decode, atau bahkan hanya URLEncoder.decode? Mengapa membuat semuanya mubazir dan menggembung? Karena itu java.
BT
30
Dan kemudian Anda harus menangani UnsupportedEncodingException, meskipun UTF-8 harus didukung di mana-mana.
Dave Cameron
8
@tc .: Java 7 diperkenalkan konstanta ini: StandardCharsets.US_ASCII, StandardCharsets.UTF_8dll Sayangnya, URLEncoder.encodetidak menerima Charset... (tapi banyak moethods lain lakukan).
sleske
12
Saran kecil - gunakan URLEncoder.encode(<urlStringToBeEncoded>, StandardCharsets.UTF_8.name()). Menggunakan statis konstan UTF_8's toString()metode sebagai skema pengkodean karakter melempar java.nio.charset.IllegalCharsetNameException: java.nio.charset.CharsetICU[UTF-8]sebagai toString()hasil 'java.nio.charset.CharsetICU [UTF-8]'. Untuk mendapatkan "UTF-8" yang diinginkan, gunakan name()metode ini.
et_l
31

Kamu harus menggunakan:

URLEncoder.encode("NAME", "UTF-8");
Atul Darne
sumber
24

Gunakan kelas URLEncoder :

URLEncoder.encode(String s, String enc)

Dimana:

s - String yang akan diterjemahkan.

enc - Nama pengkodean karakter yang didukung .

Rangkaian standar:

US-ASCII Seven-bit ASCII, alias ISO646-AS, alias blok Latin Dasar dari karakter Unicode mengatur ISO-8859-1 ISO Latin Alphabet No. 1, alias ISO-LATIN-1

UTF-8 Delapan-bit Format Transformasi UCS

UTF-16BE Enam belas-bit Format Transformasi UCS, urutan byte big-endian

UTF-16LE Format Transformasi UCS Enam Belas-bit, urutan byte-endian kecil

UTF-16 Enam belas-bit UCS Transformation Format, urutan byte diidentifikasi oleh tanda urutan byte opsional

Contoh:

import java.net.URLEncoder;

String stringEncoded = URLEncoder.encode(
    "This text must be encoded! aeiou áéíóú ñ, peace!", "UTF-8");
Jorgesys
sumber
1

Parameter pertama adalah String untuk disandikan; yang kedua adalah nama pengkodean karakter yang akan digunakan (misalnya, UTF-8).

pengguna3591718
sumber
0

Sebagai referensi tambahan untuk respons lain, alih-alih menggunakan "UTF-8" Anda dapat menggunakan:

HTTP.UTF_8

yang disertakan sejak Java 4 sebagai bagian dari pustaka org.apache.http.protocol, yang disertakan juga sejak Android API 1.

htafoya
sumber
Salah , kelas ini ditemukan di org.apache.http.protocol.HTTPkelas perpustakaan Apache HttpClient 4.x.
Buhake Sindi
@ BahakeSindi benar, saya membaca API 1 tapi itu dari Android bukan Java, baik itu ada sebelum Java 7, bahkan sudah usang sudah haha.
htafoya
tidak, kelas ini tidak pernah ada di versi Java JDK. Android mengikuti perpustakaan Apache HttpClient (Saya tidak akan terkejut jika mereka mengambil kode sumber dari sana juga).
Buhake Sindi
3
peringatan: [deprecation] UTF_8 dalam HTTP telah ditinggalkan .
sgtdck
0

Penggunaan org.apache.commons.httpclient.URItidak sepenuhnya merupakan masalah; apa masalah adalah bahwa Anda menargetkan konstruktor yang salah, yang adalah disusutkan.

Menggunakan adil

new URI( [string] );

Memang akan menandai itu sebagai disusutkan. Yang diperlukan adalah menyediakan setidaknya satu argumen tambahan (yang pertama, di bawah), dan idealnya dua:

  1. escaped: true jika urutan karakter URI dalam bentuk escaped. salah kalau tidak.
  2. charset: string charset untuk melakukan escape encoding, jika perlu

Ini akan menargetkan konstruktor yang tidak disusutkan di dalam kelas itu. Jadi penggunaan yang ideal adalah seperti itu:

new URI( [string], true, StandardCharsets.UTF_8.toString() );

Agak gila di akhir permainan (rambut lebih dari 11 tahun kemudian - egad! ), Tapi saya harap ini membantu orang lain, terutama jika metode di ujung masih mengharapkan URI, seperti org.apache.commons.httpclient.setURI().

R. Kåbis
sumber