2013-03-19 90 views
1

我有以下网址:处理URL用变音符号和其他特殊字符

https://mantis.server.company/download/test/0022450-umlauts_öä_üüü_and_special_chars_%&$#.pdf 

没有办法之前,将字符串编码。 我只需要处理这个字符串(我知道它不是一个有效的URL字符串),以便可以打开位于该路径后面的文件。

String url = "https://mantis-daun.server.company/download/test/0022450-umlauts_öä_üüü_and_special_chars_%&$#.pdf"; 

try { 
    url = URLDecoder.decode(url, "UTF-8"); 
    URL myConnection = new URL(url); 
    URLConnection connectMe = myConnection.openConnection(); 
    // Only for error processing 
    HttpURLConnection httpConn = (HttpURLConnection) connectMe; 
    InputStream is; 
    if (httpConn.getResponseCode() >= 400) { 
     is = httpConn.getErrorStream(); 
    } else { 
     is = httpConn.getInputStream(); 
    } 
    BufferedReader rd = new BufferedReader(new InputStreamReader(is)); 
     String line; 
     while ((line = rd.readLine()) != null) 
     { 
      System.out.println("-----" + line); 
     } 
     rd.close();  
    InputStream in = connectMe.getInputStream(); 
    BufferedInputStream bin = new BufferedInputStream(in); 
    byte[] buffer = new byte[(int)connectMe.getContentLength()]; 
    int fi = 0; 
    while(fi<buffer.length) { 
     fi = fi + bin.read(buffer, fi, buffer.length - fi); 
    } 
    bin.close(); 
} catch (MalformedURLException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

通过这种方法获得:

Exception in thread "main" java.lang.IllegalArgumentException: URLDecoder: Illegal hex characters in escape (%) pattern - For input string: "&$" 
    at java.net.URLDecoder.decode(URLDecoder.java:173) 
    at org.mssql.main.MSSQLAccess.main(MSSQLAccess.java:34) 

随着url = url.replaceAll("%", "%25");我得到:

-----<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> 
-----<html><head> 
-----<title>400 Bad Request</title> 
-----</head><body> 
-----<h1>Bad Request</h1> 
-----<p>Your browser sent a request that this server could not understand.<br /> 
-----</p> 
-----<hr> 
java.io.IOException: Server returned HTTP response code: 400 for URL: https://mantis-daun.server.company/download/test/0022450-umlauts_öä_üüü_and_special_chars_%&$#.pdf 
-----<address>Apache/2.2.9 (Debian) PHP/5.2.6-1+lenny16 with Suhosin-Patch mod_ssl/2.2.9 OpenSSL/0.9.8o Server at mantis-daun.server.company Port 443</address> 
-----</body></html> 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
    at sun.net.www.protocol.http.HttpURLConnection$6.run(HttpURLConnection.java:1491) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.net.www.protocol.http.HttpURLConnection.getChainedException(HttpURLConnection.java:1485) 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1139) 
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:234) 
    at org.mssql.main.MSSQLAccess.main(MSSQLAccess.java:51) 
Caused by: java.io.IOException: Server returned HTTP response code: 400 for URL: https://mantis-daun.server.company/download/test/0022450-umlauts_öä_üüü_and_special_chars_%&$#.pdf 
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1436) 
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:379) 
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:318) 
at org.mssql.main.MSSQLAccess.main(MSSQLAccess.java:39) 

如果我想在一个正常的浏览器中打开 “URL” 我得到的也是一个“ 400:坏请求“。

那么,有没有办法处理与元音变音和特殊字符的字符串,以便它可以用作“URL”?

也许服务器设置也有问题吗?

回答

0

首先,Xavjer指出,需要编码的URL。接下来,分割URL并且仅对路径的“文本”部分进行编码是有意义的。域名没有编码(如果你有非拉丁域名,它必须根据Punycode进行编码),还必须保留路径分隔符(当你编码整个URL时,情况并非如此)。所以你只编码“下载”,“测试”和文件名+扩展部分

+0

With:“0022450-umlauts_öä_üüü_and_special_chars_%& 。$#PDF“; url2 = URLEncoder.encode(url2,“UTF-8”); url = url +“/ download/test /”+ url2;我得到:java.io.FileNotFoundException:https://mantis-daun.server.company/download/test/0022450-umlauts_%C3%B6%C3%A4_%C3%BC%C3%BC%C3%BC_and_special_chars_%25 %26%24%23.pdf!但是文件肯定存在于文件系统中。 – sk2212 2013-03-19 08:54:47

+0

那么,你可以尝试“ISO-8859-1”而不是“UTF-8”,但如果这不起作用,你的路径不正确 – Xavjer 2013-03-19 09:06:11

+0

这就是诀窍!使用“ISO-8859-1”,并且只需要“编码”url部分的答案,它现在可以正常工作。 – sk2212 2013-03-19 09:12:33

1

那么,你尝试解码的网址,但你实际上应该编码它使你的愿望。它实际上是崩溃,因为它试图解码%& $这是没有有效的十六进制迹象...

编码会导致: HTTPS%3A%2F%2Fmantis-daun.server.company%2Fdownload%2Ftest%2F0022450- umlauts_%C3%B6%C3%A4_%C3%BC%C3%BC%C3%BC_and_special_chars_%25%26%24%23.pdf

+0

当然,但这个URL也是不可用的 - > java.net.MalformedURLException:没有协议:https%3A%2F%2Fmantis-daun。 server.company%2Fdownload%2Ftest%2F0022450-umlauts_%C3%B6%C3%A4_%C3%BC%C3%BC%C3%BC_and_special_chars_%25%26%24%23.pdf – sk2212 2013-03-19 08:44:46