2012-06-15 94 views
2

我正在進行西班牙語版本的搜索,並且在用戶輸入西班牙字符時(例如HÍBRIDOS),我看到一些異常(如下所示)。顯示我如何編碼如下。 網址發送過來的電線如圖所示。西班牙語字符和URISyntaxException

url=http://wwwdev.searchbridg.com/absd/JSONControllerServlet.do?&N=0&Ntk=AllText&Ntt=HÃBRIDOS&Nty=1&Ntx=mode+matchall

DefaultHttpClient httpClient = new DefaultHttpClient(); 
    HttpParams params = httpClient.getParams(); 
    try { 
     HttpConnectionParams.setConnectionTimeout(params, 10000); 
     HttpConnectionParams.setSoTimeout(params, 10000); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     throw e; 
    } 
    HttpHost proxy = new HttpHost(getProxy(), getProxyPort()); 
    ConnRouteParams.setDefaultProxy(params, proxy); 
    URI uri; 
    InputStream data = null; 
     uri = new URI(url); 
     HttpGet method = new HttpGet(uri); 
     HttpResponse response=null; 
     try { 
     response = httpClient.execute(method); 
     }catch(Exception e) { 
      e.printStackTrace(); 
      throw e; 
     } 
     data = response.getEntity().getContent(); 
    Reader r = new InputStreamReader(data); 
    HashMap<String, Object> jsonObj = (HashMap<String, Object>) GenericJSONUtil.fromJson(r); 

java.net.URISyntaxException: Illegal character in query at index 101: http://wwwdev.searchbridge.com/abs/JSONControllerServlet.do?&N=0&Ntk=AllText&Ntt=H├?BRIDOS&Nty=1&Ntx=mode+matchall 
    at java.net.URI$Parser.fail(URI.java:2816) 
    at java.net.URI$Parser.checkChars(URI.java:2989) 
    at java.net.URI$Parser.parseHierarchical(URI.java:3079) 
    at java.net.URI$Parser.parse(URI.java:3021) 
    at java.net.URI.<init>(URI.java:578) 

我嘗試使用UTF-8編碼,但仍不能工作顯示同樣的異常編碼。如果你在請求(GET請求)發送特殊字符的HTML頁面設置爲<meta charset="utf-8" />

byte[] bytes = url.getBytes("UTF8"); 
    String stringuRL = new String(bytes,"UTF-8"); 
     uri = new URI(stringuRL); 
+0

? –

+0

我構建查詢以發送到搜索服務 – pushya

回答

4

,你必須URLescape他們。看看這個線程找出如何。 HTTP URL Address Encoding in Java

當您收到請求時,您必須執行相反的過程來獲取原始單詞。

+0

通常,應用程序服務器(Tomcat,JBoss等)具有關於如何對此進行解碼的配置。 'URIEncoding'被稱爲... – helios

+0

@helios確實。此外,如果您需要使應用與容器分離,您將使用與容器/ Web服務器無關的東西 – Alfabravo

+0

@Alfabravo如果我在javascript中對字符串進行編碼並將其發送給java支持,那麼我需要解碼回在通過電線發送之前轉換爲原始字符 – pushya

1

get請求中的所有參數都需要對其值進行編碼。

如果您使用了HTTPClient 4,你可以這樣做或多或少是這樣的:

List<NameValuePair> parameters = new ArrayList<NameValuePair>(); 
parameters.add(new BasicNameValuePair("parameter_name_Ã", "another value with ~ãé")); 
parameters.add(new BasicNameValuePair("second_parameter", "still other ú û")); 
String url = "http://foo.bar/?" + URLEncodedUtils.format(parameters, "UTF-8"); 

在這種情況下,其結果將是http://foo.bar/?parameter_name_%C3%83=another+value+with+%7E%C3%A3%C3%A9&second_parameter=still+other+%C3%BA+%C3%BB

從哪兒弄來了`url`值
+0

通常應用服務器(Tomcat,JBoss等)具有關於如何解碼的配置。調用URIEncoding ...請注意服務器必須使用相同的char編碼(在本例中爲UTF-8)。 – helios