我需要每天为几个 URL 测试我的服务器,因为这些 URL 由我的用户更新 - 这将在 Java 中完成。但是,这些 URL 包含奇怪的字符(如德语变音符号)。基本上我正在做的是:
for every URL in the list to check
URL u = new URL(the_url);
u.openConnection(..);
// read the content and handle it
现在,我发现 org.apache.commons.codec.net.URLCodec
可以很好地编码字符串以粘贴到 QueryString 中,而不适合将奇怪的 URL 编码到它们的十六进制对应物。以下是 URL 的一些示例:
- http://www.example com/u/überraum-03/
- http://www.example com/u/são-paulo-dude/
- http://www.example com/u/håkon-hellström/
第一个期望的结果是;
- http://www.example com/u/%c3%9berraum-03/
Apache Commons 或 java 本身是否有任何库来转换 ACTUAL url 中的特殊字符(不是查询字符串 - 因此不会替换相同类型的字符)?
感谢您的宝贵时间。
已编辑 Firefox 翻译“yr.no/place/Norway/Nordland/Moskenes/Å/data.html”;进入“yr.no/place/Norway/Nordland/Moskenes/%C3%85/data.html”(通过输入第一个 URL 进行尝试,按回车键,然后将 URL 复制到文档中)。我正在寻找的正是这种效果——因为这是实际的翻译。最有可能发生的情况是 FF 知道 Å 是坏事,它尝试多个版本或者它接受服务器的“Location” header ;无论哪种方式 - 仅在 URL 的一个子集上存在从“Å”到“%C3%85”的转换。这就是我们需要的功能。
已编辑 我刚刚验证了评论者给出的代码无法正常工作。例如,试试这个:
try{
String urlStr = "http://www.yr.no/place/Norway/Nordland/Moskenes/Å/data.html";
URL u=new URL(urlStr);
URI uri = new URI(u.getProtocol(),
u.getUserInfo(), u.getHost(), u.getPort(),
u.getPath(), u.getQuery(),
null); // removing ref
URL urlObj = uri.toURL();
HttpURLConnection connection = (HttpURLConnection) urlObj.openConnection();
connection.setInstanceFollowRedirects(false);
connection.connect();
for (int i=0;i<connection.getHeaderFields().size();i++)
System.out.println(connection.getHeaderFieldKey(i)+": "+connection.getHeaderField(i));
System.exit(0);
}catch(Exception e){e.printStackTrace();};
将产生 404 错误 - 奇怪的是编码部分也不起作用。
最佳答案
如果您需要一个有效 URI(符合 RFC 2396 标准)的 URL,您可以用 Java 创建一个这样的 URL
String urlString = "http://www.example.com/u/håkon-hellström/";
URL url = new URL(urlString);
URI uri = new URI(url.getProtocol(),url.getAuthority(), url.getPath(), url.getQuery(), url.getRef());
url = new URL(uri.toASCIIString());
也就是说,您提供的所有三个示例字符串都符合 RFC 2396 标准,不需要编码。我假设您提供的 URL 的权限部分中的空格是拼写错误。
编辑:
我更新了上面的代码块。通过使用 URI.toASCIIString()
您可以将生成的 URI 限制为仅 US-ASCII 字符(其他字符已编码)。然后,生成的字符串可用于创建新的有效 URL。
http://www.example.com/u/håkon-hellström/
更改为
http://www.example.com/u/h%C3%A5kon-hellstr%C3%B6m/
关于java - 编码发送到服务器的 URL(不在查询中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9038101/