java.net.URLEncoder.encode(String) 已弃用,我应该改用啥?
Posted
技术标签:
【中文标题】java.net.URLEncoder.encode(String) 已弃用,我应该改用啥?【英文标题】:java.net.URLEncoder.encode(String) is deprecated, what should I use instead?java.net.URLEncoder.encode(String) 已弃用,我应该改用什么? 【发布时间】:2010-09-17 19:54:48 【问题描述】:我在使用java.net.URLEncoder.encode
时收到以下警告:
警告:[弃用] 编码(java.lang.String) 在 java.net.URLEncoder 中已被弃用
我应该改用什么?
【问题讨论】:
这在文档中的弃用标签中得到了回答:“相反,使用 encode(String,String) 方法来指定编码。”见java.sun.com/javase/6/docs/api/java/net/URLEncoder.html。 【参考方案1】:使用URLEncoder中的另一个encode
方法:
URLEncoder.encode(String, String)
第一个参数是要编码的文本;第二个是要使用的字符编码的名称(例如,UTF-8
)。例如:
System.out.println(
URLEncoder.encode(
"urlParameterString",
java.nio.charset.StandardCharsets.UTF_8.toString()
)
);
【讨论】:
@jsh:我很困惑,为什么不应该有 URLDecoder?为什么这会使 Java 臃肿?这些是静态方法。键入任何一个都需要相同的努力。如果你喜欢 Python,为什么要使用 Java 编程?是不是因为使用 Java 的人比使用 Python 的人多,而你得到的是 Java 工作而不是 Python 工作? 他称它为臃肿,因为它过度填充了全局类命名空间。当你可以有 URL.encode 和 URL.decode,甚至只是 URLEncoder.decode 时,为什么还要有 URLEncoder.encode 和 URLDecoder.decode?为什么要让它变得多余和臃肿?因为它的 java. 然后你必须处理 UnsupportedEncodingException,尽管 UTF-8 应该在几乎所有地方都得到支持。 @tc.:Java 7 引入了这些常量:StandardCharsets.US_ASCII
、StandardCharsets.UTF_8
等。不幸的是,URLEncoder.encode
不接受 Charset
...(但许多其他方法可以)。
小建议 - 使用URLEncoder.encode(<urlStringToBeEncoded>, StandardCharsets.UTF_8.name())
。使用静态常量UTF_8
的toString()
方法作为字符编码方案会抛出java.nio.charset.IllegalCharsetNameException: java.nio.charset.CharsetICU[UTF-8]
,因为toString()
返回“java.nio.charset.CharsetICU[UTF-8]”。要获得所需的“UTF-8”,请改用其name()
方法。【参考方案2】:
你应该使用:
URLEncoder.encode("NAME", "UTF-8");
【讨论】:
【参考方案3】:第一个参数是要编码的字符串;第二个是要使用的字符编码的名称(例如,UTF-8)。
【讨论】:
【参考方案4】:作为其他响应的附加参考,您可以使用:
,而不是使用 "UTF-8":HTTP.UTF_8
自 Java 4 起作为 org.apache.http.protocol 库的一部分包含,自 android API 1 起也包含在内。
【讨论】:
错,这个类在Apache HttpClient 4.x库org.apache.http.protocol.HTTP
类中找到。
@BuhakeSindi 是的,我读过 API 1,但它是 Android 而不是 Java,无论如何它在 Java 7 之前就存在,它甚至已经被弃用了哈哈。
不,这个类从不存在于任何版本的 Java JDK 中。 Android 遵循 Apache HttpClient 库(如果他们也从那里获取源代码,我不会感到惊讶)。
警告:[deprecation] HTTP 中的 UTF_8 已被弃用。【参考方案5】:
使用类URLEncoder:
URLEncoder.encode(String s, String enc)
地点:
s - 要翻译的字符串。
enc - 支持的 character encoding 的名称。
标准字符集:
US-ASCII 七位 ASCII,又名 ISO646-US,又名 Unicode 字符集的基本拉丁语块 ISO-8859-1 ISO 拉丁字母 No. 1,又名 ISO-LATIN-1
UTF-8 八位 UCS 转换格式
UTF-16BE 16 位 UCS 转换格式,大端字节序
UTF-16LE 十六位 UCS 转换格式,小端字节序
UTF-16 十六位 UCS 转换格式,字节顺序由可选字节顺序标记标识
示例:
import java.net.URLEncoder;
String stringEncoded = URLEncoder.encode(
"This text must be encoded! aeiou áéíóú ñ, peace!", "UTF-8");
【讨论】:
【参考方案6】:org.apache.commons.httpclient.URI
的使用并非严格意义上的问题;问题是您针对错误的构造函数, 已贬值。
只使用
new URI( [string] );
确实会将其标记为已折旧。需要的是至少提供一个额外的参数(第一个,下面),最好是两个:
escaped
:如果 URI 字符序列采用转义形式,则为 true。否则为假。
charset
: 进行转义编码的 charset 字符串,如果
必填
这将针对该类中的非折旧构造函数。所以理想的用法是这样的:
new URI( [string], true, StandardCharsets.UTF_8.toString() );
在游戏后期有点疯狂(11 年后的头发 - egad!),但我希望这对其他人有所帮助,特别是如果远端的方法是 仍然需要一个 URI,例如 org.apache.commons.httpclient.setURI()
。
【讨论】:
以上是关于java.net.URLEncoder.encode(String) 已弃用,我应该改用啥?的主要内容,如果未能解决你的问题,请参考以下文章