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_ASCIIStandardCharsets.UTF_8 等。不幸的是,URLEncoder.encode 不接受 Charset...(但许多其他方法可以)。 小建议 - 使用URLEncoder.encode(<urlStringToBeEncoded>, StandardCharsets.UTF_8.name())。使用静态常量UTF_8toString() 方法作为字符编码方案会抛出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) 已弃用,我应该改用啥?的主要内容,如果未能解决你的问题,请参考以下文章