如何在Java中进行URL解码?

cra*_*ace 311 java url-encoding

在Java中,我想转换它:

https%3A%2F%2Fmywebsite%2Fdocs%2Fenglish%2Fsite%2Fmybook.do%3Frequest_type
Run Code Online (Sandbox Code Playgroud)

对此:

https://mywebsite/docs/english/site/mybook.do&request_type
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止:

class StringUTF 
{
    public static void main(String[] args) 
    {
        try{
            String url = 
               "https%3A%2F%2Fmywebsite%2Fdocs%2Fenglish%2Fsite%2Fmybook.do" +
               "%3Frequest_type%3D%26type%3Dprivate";

            System.out.println(url+"Hello World!------->" +
                new String(url.getBytes("UTF-8"),"ASCII"));
        }
        catch(Exception E){
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但它不能正常工作.这些%3A%2F格式被称为什么以及如何转换它们?

Jes*_*per 615

这与UTF-8或ASCII等字符编码无关.你在那里的字符串是URL编码.这种编码与字符编码完全不同.

尝试这样的事情:

try {
    String result = java.net.URLDecoder.decode(url, StandardCharsets.UTF_8.name());
} catch (UnsupportedEncodingException e) {
    // not going to happen - value came from JDK's own StandardCharsets
}
Run Code Online (Sandbox Code Playgroud)

Java 10增加Charset了对API的直接支持,这意味着不需要捕获UnsupportedEncodingException:

String result = java.net.URLDecoder.decode(url, StandardCharsets.UTF_8);
Run Code Online (Sandbox Code Playgroud)

请注意,字符编码(例如UTF-8或ASCII)决定了字符到原始字节的映射.有关字符编码的详细介绍,请参阅此文章.

  • 如果使用java 1.7+,您可以使用"UTF-8"字符串的静态版本:来自此软件包的`StandardCharsets.UTF_8.name()`:`java.nio.charset.StandardCharsets`.与此相关:[link](http://stackoverflow.com/questions/6698354/where-to-get-utf-8-string-literal-in-java) (22认同)
  • 小心这个.如上所述:http://blog.lunatech.com/2009/02/03/what-every-web-developer-must-know-about-url-encoding#Donotuse%7B%7Bjava.net.URLEncoder%7D% 7Dor%7B%7Bjava.net.URLDecoder%7D%7DforwholeURLs这不是关于URL,而是关于HTML表单编码. (3认同)
  • @Trismegistos根据Java 7 API文档,不推荐使用未指定字符编码的版本(第二个参数,"UTF-8"`).使用具有两个参数的版本. (2认同)

Ale*_*yak 50

你得到的字符串是application/x-www-form-urlencoded编码.

使用URLDecoder将其转换为Java String.

URLDecoder.decode( url, "UTF-8" );
Run Code Online (Sandbox Code Playgroud)


Nic*_*aly 45

之前已经回答(尽管这个问题是第一个!):

"您应该使用java.net.URI来执行此操作,因为URLDecoder类执行x-www-form-urlencoded解码是错误的(尽管名称,它是表单数据)."

基本上:

String url = "https%3A%2F%2Fmywebsite%2Fdocs%2Fenglish%2Fsite%2Fmybook.do%3Frequest_type";
System.out.println(new java.net.URI(url).getPath());
Run Code Online (Sandbox Code Playgroud)

会给你:

https://mywebsite/docs/english/site/mybook.do?request_type
Run Code Online (Sandbox Code Playgroud)

  • 在Java 1.7中,不推荐使用`URLDecoder.decode(String,String)`重载.你必须在没有编码的情况下引用`URLDecoder.decode(String)`重载.您可能需要更新帖子以进行说明. (6认同)
  • 这个答案有误导性; 该块报价与弃用无关.不推荐使用的方法的Javadoc声明,我实际引用`@deprecated结果字符串可能会有所不同,具体取决于平台的默认编码.而是使用decode(String,String)方法指定编码 (2认同)
  • 如上所述,用于 URI 的 getPath() 仅返回 URI 的路径部分。 (2认同)
  • 除非我弄错了,否则已知“路径”是权限部分之后的 URI 部分(请参阅:https://en.wikipedia.org/wiki/Uniform_Resource_Identifier 以了解路径的定义) - 在我看来我看到的行为是标准/正确的行为。我正在使用 java 1.8.0_101(在 Android Studio 上)。我很想知道您在调用“getAuthority()”时会得到什么。即使这篇文章/示例似乎也表明路径只是其 URI 的 /public/manual/appliances 部分:http://www.quepublishing.com/articles/article.aspx?p=26566&seqNum=3 (2认同)
  • @Pelpotronic 帖子中的代码实际上确实打印了它显示的输出(至少对我而言)。我认为这样做的原因是,由于 URL 编码,URI 构造函数实际上将整个字符串 (`https%3A%2F...`) 视为 URI 的路径;没有权限或查询等。这可以通过调用 URI 对象上的相应 get 方法来测试。如果将解码后的文本传递给 URI 构造函数:`new URI("https://mywebsite/do.....")`,则调用 `getPath()` 和其他方法将给出正确的结果。 (2认同)

laz*_*laz 14

%3A并且%2F是URL编码的字符.使用此java代码将它们转换回:/

String decoded = java.net.URLDecoder.decode(url, "UTF-8");
Run Code Online (Sandbox Code Playgroud)

  • 它也不会转换%2C,它是(,) (2认同)

Sor*_*ter 6

我使用阿帕奇公共资源

String decodedUrl = new URLCodec().decode(url);
Run Code Online (Sandbox Code Playgroud)

默认字符集是UTF-8


小智 5

 try {
        String result = URLDecoder.decode(urlString, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
Run Code Online (Sandbox Code Playgroud)


Ron*_*iya 5

public String decodeString(String URL)
    {

    String urlString="";
    try {
        urlString = URLDecoder.decode(URL,"UTF-8");
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block

        }

        return urlString;

    }
Run Code Online (Sandbox Code Playgroud)

  • 您能否详细说明您的答案,并提供有关您提供的解决方案的更多说明? (4认同)