java.net.URLEncoder.encode(String)已弃用,我应该改用什么?


191

使用时收到以下警告java.net.URLEncoder.encode

警告:[不建议使用] encoding(java.lang.String)
         在java.net.URLEncoder中已弃用

我应该改用什么?


23
在文档的弃用标签中对此进行了回答:“相反,请使用encode(String,String)方法指定编码。” 请参阅java.sun.com/javase/6/docs/api/java/net/URLEncoder.html
迈克尔·迈尔斯

Answers:


276

使用URLEncoder中的其他encode方法:

URLEncoder.encode(String, String)

第一个参数是要编码的文本。第二个是要使用的字符编码的名称(例如UTF-8)。例如:

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

14
@jsh:我很困惑,为什么不应该有一个URLDecoder?为什么这会使Java肿?这些是静态方法。键入任何一个都需要花费相同的精力。如果您喜欢Python,为什么要用Java编程?是因为使用Java的人比使用Python的人多,而您得到的是Java而不是Python的工作吗?
stepanian '02

10
他之所以称它膨胀是因为它过度填充了全局类名称空间。当您可以同时拥有URL.encode和URL.decode甚至只有URLEncoder.decode时,为什么还要具有URLEncoder.encode和URLDecoder.decode?为什么要使所有这些都变得多余又膨胀?因为它的java。
英国电信

30
然后,即使几乎所有地方都支持UTF-8,您也必须处理UnsupportedEncodingException。
戴夫·卡梅伦

8
@tc .: Java 7引入了这些常量:StandardCharsets.US_ASCIIStandardCharsets.UTF_8等等。不幸的是,URLEncoder.encode它不接受Charset...(但是许多其他方法都接受)。
sleske

12
次要建议-使用URLEncoder.encode(<urlStringToBeEncoded>, StandardCharsets.UTF_8.name())。使用静态常量UTF_8toString()方法作为字符编码方案时,将抛出“ java.nio.charset.CharsetICU [UTF-8]” java.nio.charset.IllegalCharsetNameException: java.nio.charset.CharsetICU[UTF-8]作为toString()返回值。要获得所需的“ UTF-8”,请改用其name()方法。
et_l


24

使用类URLEncoder

URLEncoder.encode(String s, String enc)

哪里:

s-要转换的字符串。

enc-支持的字符编码的名称。

标准字符集:

US-ASCII 七位ASCII,又名ISO646-US,又名Unicode字符集的基本拉丁字块ISO-8859-1 ISO拉丁字母1号,又名ISO-LATIN-1

UTF-8八位UCS转换格式

UTF-16BE 十六位UCS转换格式,大端字节顺序

UTF-16LE 十六位UCS转换格式,小尾数字节顺序

UTF-16十六位UCS转换格式,字节顺序由可选的字节顺序标记标识

例:

import java.net.URLEncoder;

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

1

第一个参数是要编码的字符串;第二个是要使用的字符编码的名称(例如UTF-8)。


0

作为其他响应的补充参考,可以使用以下代替使用“ UTF-8”

HTTP.UTF_8

从Java 4开始就包含在org.apache.http.protocol库中,而从Android API 1开始也包含了该库。


错误的是,该类在Apache HttpClient 4.x库org.apache.http.protocol.HTTP类中找到。
Buhake Sindi 2014年

@BuhakeSindi是的,我读了API 1,但它是Android而不是Java,无论哪种方式,它都存在于Java 7之前,甚至已经弃用了哈哈。
htafoya 2014年

不,此类在任何版本的Java JDK中都不存在。Android遵循Apache HttpClient库(如果他们也从那里获取源代码,我不会感到惊讶)。
Buhake Sindi 2014年

3
警告:不推荐使用HTTP中的[UTF_8]
sgtdck

0

org.apache.commons.httpclient.URI严格来说,使用不是问题。问题是您针对的是错误的构造函数(贬值)。

仅使用

new URI( [string] );

确实会将其标记为已折旧。所需要的是至少提供一个额外的参数(下面是第一个参数),理想情况下是两个:

  1. escaped:如果URI字符序列为转义形式,则为true。否则为假。
  2. charset:字符集字符串,以进行转义编码(如果需要)

这将针对该类中未折旧的构造函数。因此理想的用法是这样的:

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

在游戏中有点晚了点(11年后才染发,例如egad!),但我希望这对其他人有帮助,尤其是在远端的方法希望使用URI的情况下,例如org.apache.commons.httpclient.setURI()

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.