【问题标题】: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 中已被弃用

我应该改用什么?

【问题讨论】:

标签: java url network-programming deprecated


【解决方案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] );
        

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

        1. escaped:如果 URI 字符序列采用转义形式,则为 true。否则为假。
        2. charset: 进行转义编码的 charset 字符串,如果 必填

        这将针对该类中的非折旧构造函数。所以理想的用法是这样的:

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

        在游戏后期有点疯狂(11 年后的头发 - egad!),但我希望这对其他人有所帮助,特别是如果远端的方法是 仍然需要一个 URI,例如 org.apache.commons.httpclient.setURI()

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-08-28
          • 1970-01-01
          • 2014-01-09
          • 2019-03-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-01
          相关资源
          最近更新 更多