如果有不明智的字符,如何将URL转换为URI?

Mar*_*k R 6 java url uri http

我有URL对象,路径包含不明智的字符(RFC 2396)在我的情况下它是"|" (管)字符.现在我需要安全地将其转换为URI,但URL.toURI()抛出异常.

我读过URL文档,但这部分让我感到困惑:

URL类本身不会根据RFC2396中定义的转义机制对任何URL组件进行编码或解码.调用者负责编码任何字段,这些字段需要在调用URL之前进行转义,并且还要解码从URL返回的任何转义字段.此外,由于URL不知道URL转义,因此它无法识别相同URL的编码或解码形式之间的等效性.

那我该怎么办呢?在转换过程中对此字符进行编码的模式是什么?我是否需要创建URL对象的编码副本?

Mar*_*k R 3

好吧,我想出了这样的东西:

URI uri = new URI(url.getProtocol(), 
                  null /*userInfo*/,
                  url.getHost(), 
                  url.getPort(), 
                  (url.getPath()==null)?null:URLDecoder.decode(url.getPath(), "UTF-8"),
                  (url.getQuery()==null)?null:URLDecoder.decode(url.getQuery(), "UTF-8"),
                  null /*fragment*/);
Run Code Online (Sandbox Code Playgroud)

看起来可行,这是一个例子。有人可以确认这是正确的解决方案吗?

编辑初始解决方案在有查询时出现一些问题,所以我已经修复了它。