Java中的URL百分比编码

时间:2013-09-19 16:48:18

标签: java url url-encoding

URL url = new URL("http://www.example.com/data.php?q=%FD");
logger.info("url: " + url);
URI uri = url.toURI();
logger.info("uri ASCII: " + uri.toASCIIString());
logger.info("uri str  : " + uri.toString());
logger.info("query    : " + uri.getQuery());
logger.info("decoded  : " + URLDecoder.decode(ur.getRawQuery(), "WINDOWS-1252"));

String scheme = uri.getScheme();
String auth   = uri.getAuthority();
String path   = uri.getPath();
String query  = uri.getQuery();

URI cleanedURI = new URI(scheme, auth, path, query, null);
logger.info("cleaned uri ASCII: " + cleanedURI.toASCIIString());
logger.info("cleaned uri str  : " + cleanedURI.toString());

输出结果为:

url: http://www.example.com/data.php?q=%FD

uri ASCII: http://www.example.com/data.php?q=%FD
uri str  : http://www.example.com/data.php?q=%FD

query: q=�
decoded: q=ý

cleaned uri ASCII: http://www.example.com/data.php?q=%EF%BF%BD
cleaned uri str  : http://www.example.com/data.php?q=�

因此,当我将URI拆分为多个部分,然后再次构建时,我无法取回原始URL。如何取回原始网址,这是一个正确的百分比编码的有效网址。

我没有获得%EF%BF%BD,而是需要获得原来的%3F。

(实际上我想要实现的是以干净的方式操作URL的某些部分,例如删除片段,但这与我的问题没什么关系。)

1 个答案:

答案 0 :(得分:-1)

网址http://www.example.com/data.php?q=?http://www.example.com/data.php?q=%3F

相同

%3F(或数字63)只不过是字符'?'的ascii代码。 请在此处查看:http://grox.net/utils/encoding.html

因此,如果您点击了网址为%3f or '?'的浏览器;它应该表现得一样。

如果您非常关心它在控制台上的显示方式,您可以试试这个。

String query  = uri.getQuery();

char charData = query.charAt(0);  // fetch the character from String

int asciiValue = (int)charData;

您可以查看String's getByte()方法。这里有一个简短的教程 - http://www.tutorialspoint.com/java/java_string_getbytes.htm