java.net.URLEncoder.encode (Chuỗi) không được dùng nữa, tôi nên sử dụng cái gì thay thế?


192

Tôi nhận được cảnh báo sau khi sử dụng java.net.URLEncoder.encode:

cảnh báo: [deprecation] mã hóa (java.lang.String)
         trong java.net.URLEncoder đã không được dùng nữa

Tôi nên sử dụng cái gì thay thế?


23
Điều này được trả lời trong thẻ không dùng trong tài liệu: "Thay vào đó, hãy sử dụng phương thức mã hóa (Chuỗi, Chuỗi) để chỉ định mã hóa." Xem java.sun.com/javase/6/docs/api/java/net/URLEncoder.html .
Michael Myers

Câu trả lời:


277

Sử dụng encodephương pháp khác trong URLEncoder :

URLEncoder.encode(String, String)

Tham số đầu tiên là văn bản để mã hóa; thứ hai là tên của mã hóa ký tự sẽ sử dụng (ví dụ UTF-8:). Ví dụ:

System.out.println(
  URLEncoder.encode(
    "urlParameterString",
    java.nio.charset.StandardCharsets.UTF_8.toString()
  )
);

14
@jsh: Tôi bối rối, tại sao không nên có URLDecoder? Tại sao điều này làm cho Java cồng kềnh? Đây là những phương thức tĩnh. Nó sẽ mất cùng một lượng nỗ lực để gõ. Nếu bạn thích Python, tại sao bạn lại lập trình bằng Java? Có phải vì nhiều người sử dụng Java hơn Python và bạn có một công việc Java thay vì công việc Python?
stepanian

10
Anh ta gọi nó là cồng kềnh vì nó tràn ngập không gian tên lớp toàn cầu. Tại sao phải có URLEncoder.encode và URLDecoder.decode khi bạn có thể có URL.encode và URL.decode, hoặc thậm chí chỉ là URLEncoder.decode? Tại sao làm cho tất cả dư thừa và bloaty? Bởi vì java của nó.
BT

30
Và sau đó, bạn phải xử lý UnsupportedEncodingException, mặc dù UTF-8 nên được hỗ trợ khá nhiều ở mọi nơi.
Dave Cameron

8
@tc .: Java 7 đã giới thiệu những hằng số: StandardCharsets.US_ASCII, StandardCharsets.UTF_8vv Thật không may, URLEncoder.encodekhông chấp nhận một Charset... (nhưng nhiều moethods khác làm).
sleske

12
Gợi ý nhỏ - sử dụng URLEncoder.encode(<urlStringToBeEncoded>, StandardCharsets.UTF_8.name()). Sử dụng phương thức UTF_8của hằng số tĩnh toString()làm sơ đồ mã hóa ký tự ném java.nio.charset.IllegalCharsetNameException: java.nio.charset.CharsetICU[UTF-8]khi toString()trả về "java.nio.charset.CharsetICU [UTF-8]". Để có được "UTF-8" mong muốn, hãy sử dụng name()phương thức của nó .
et_l


24

Sử dụng lớp URLEncoder :

URLEncoder.encode(String s, String enc)

Ở đâu :

s - Chuỗi được dịch.

enc - Tên của mã hóa ký tự được hỗ trợ .

Bộ ký tự chuẩn:

Mỹ-ASCII Bảy bit ASCII, còn gọi là ISO646-US, còn gọi là khối Latin cơ bản của bộ ký tự Unicode ISO-8859-1 Bảng chữ cái Latinh ISO số 1, còn gọi là ISO-LATIN-1

UTF-8 Định dạng chuyển đổi UCS tám bit

UTF-16BE Định dạng chuyển đổi UCS mười sáu bit, thứ tự byte cuối lớn

UTF-16LE Định dạng chuyển đổi UCS mười sáu bit, thứ tự byte cuối nhỏ

UTF-16 Định dạng chuyển đổi UCS mười sáu bit, thứ tự byte được xác định bởi dấu thứ tự byte tùy chọn

Thí dụ:

import java.net.URLEncoder;

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

1

Tham số đầu tiên là Chuỗi để mã hóa; thứ hai là tên của mã hóa ký tự sẽ sử dụng (ví dụ: UTF-8).


0

Là một tài liệu tham khảo bổ sung cho các phản hồi khác, thay vì sử dụng "UTF-8", bạn có thể sử dụng:

HTTP.UTF_8

được bao gồm từ Java 4 như một phần của thư viện org.apache.http.protatio, cũng được bao gồm kể từ API Android 1.


Sai , lớp này được tìm thấy trong org.apache.http.protocol.HTTPlớp thư viện Apache httpClient 4.x.
Buhake Sindi

@BuhakeSindi đúng, tôi đã đọc API 1 nhưng đó là Android chứ không phải Java, dù nó tồn tại trước Java 7, nó thậm chí còn bị phản đối rồi haha.
htafoya

không, lớp này không bao giờ tồn tại trong bất kỳ phiên bản JDK Java nào. Android đi theo thư viện Apache httpClient (Tôi sẽ không ngạc nhiên nếu họ cũng lấy mã nguồn từ đó).
Buhake Sindi

3
cảnh báo: [không dùng nữa] UTF_8 trong HTTP đã không được dùng nữa .
sgtdck

0

Việc sử dụng org.apache.commons.httpclient.URIkhông hoàn toàn là một vấn đề; Vấn đề là bạn nhắm mục tiêu vào hàm tạo sai, bị khấu hao.

Chỉ sử dụng

new URI( [string] );

Thực sự sẽ đánh dấu nó như là khấu hao. Điều cần thiết là cung cấp tối thiểu một đối số bổ sung (đầu tiên, bên dưới) và lý tưởng hai:

  1. escaped: true nếu chuỗi ký tự URI ở dạng thoát. sai khác.
  2. charset: chuỗi ký tự để thực hiện mã hóa thoát, nếu cần

Điều này sẽ nhắm mục tiêu một nhà xây dựng không khấu hao trong lớp đó. Vì vậy, một cách sử dụng lý tưởng sẽ là như vậy:

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

Một chút điên rồ trong trò chơi (một mái tóc hơn 11 năm sau - egad! ), Nhưng tôi hy vọng điều này sẽ giúp người khác, đặc biệt là nếu phương pháp ở phía xa vẫn đang mong đợi một URI, chẳng hạn như org.apache.commons.httpclient.setURI().

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.