235

I get the following warning when using java.net.URLEncoder.encode:

warning: [deprecation] encode(java.lang.String)
         in java.net.URLEncoder has been deprecated

What should I be using instead?

1

6 Answers 6

322

Use the other encode method in URLEncoder:

URLEncoder.encode(String, String)

The first parameter is the text to encode; the second is the name of the character encoding to use (e.g., UTF-8). For example:

System.out.println(
  URLEncoder.encode(
    "urlParameterString",
    java.nio.charset.StandardCharsets.UTF_8.toString()
  )
);
Sign up to request clarification or add additional context in comments.

10 Comments

@jsh: I'm confused, why shouldn't there be a URLDecoder? Why does this make Java bloated? These are static methods. It would take the same amount of effort to type either. If you like Python, why are you programming in Java? Is it because more people use Java than Python and you got a Java job instead of Python job?
He's calling it bloated because its overpopulating the global class namespace. Why have URLEncoder.encode and URLDecoder.decode when you could have URL.encode and URL.decode, or even just URLEncoder.decode? Why make it all redundant and bloaty? Because its java.
And then you have to handle the UnsupportedEncodingException, even though UTF-8 should be supported pretty much everywhere.
@tc.: Java 7 introduced these constants: StandardCharsets.US_ASCII, StandardCharsets.UTF_8 etc. Unfortunately, URLEncoder.encode does not accept a Charset... (but many other moethods do).
Minor suggestion - use URLEncoder.encode(<urlStringToBeEncoded>, StandardCharsets.UTF_8.name()). Using the static constant UTF_8's toString() method as the character encoding scheme throws java.nio.charset.IllegalCharsetNameException: java.nio.charset.CharsetICU[UTF-8] as the toString() returns "java.nio.charset.CharsetICU[UTF-8]". To get the desired "UTF-8" use its name() method instead.
|
43

You should use:

URLEncoder.encode("NAME", "UTF-8");

Comments

35

Use the class URLEncoder:

URLEncoder.encode(String s, String enc)

Where :

s - String to be translated.

enc - The name of a supported character encoding.

Standard charsets:

US-ASCII Seven-bit ASCII, a.k.a. ISO646-US, a.k.a. the Basic Latin block of the Unicode character set ISO-8859-1 ISO Latin Alphabet No. 1, a.k.a. ISO-LATIN-1

UTF-8 Eight-bit UCS Transformation Format

UTF-16BE Sixteen-bit UCS Transformation Format, big-endian byte order

UTF-16LE Sixteen-bit UCS Transformation Format, little-endian byte order

UTF-16 Sixteen-bit UCS Transformation Format, byte order identified by an optional byte-order mark

Example:

import java.net.URLEncoder;

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

Comments

4

The usage of org.apache.commons.httpclient.URI is not strictly an issue; what is an issue is that you target the wrong constructor, which is depreciated.

Using just

new URI( [string] );

Will indeed flag it as depreciated. What is needed is to provide at minimum one additional argument (the first, below), and ideally two:

  1. escaped: true if URI character sequence is in escaped form. false otherwise.
  2. charset: the charset string to do escape encoding, if required

This will target a non-depreciated constructor within that class. So an ideal usage would be as such:

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

A bit crazy-late in the game (a hair over 11 years later - egad!), but I hope this helps someone else, especially if the method at the far end is still expecting a URI, such as org.apache.commons.httpclient.setURI().

Comments

2

The first parameter is the String to encode; the second is the name of the character encoding to use (e.g., UTF-8).

Comments

0

As an additional reference for the other responses, instead of using "UTF-8" you can use:

HTTP.UTF_8

which is included since Java 4 as part of the org.apache.http.protocol library, which is included also since Android API 1.

4 Comments

Wrong, this class is found in Apache HttpClient 4.x library org.apache.http.protocol.HTTP class.
@BuhakeSindi true, I read API 1 but it was of Android not Java, either way it exists before Java 7, it is even deprecated already haha.
no, this class never existed in any version of the Java JDK. Android follows the Apache HttpClient library (I won't be surprised if they took the source code from there as well).
warning: [deprecation] UTF_8 in HTTP has been deprecated.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.