2016-05-23 2 views
1

Приветствуем вас, я сейчас работаю над веб-сервисом, и у меня много проблем, чтобы этот метод работал с такими символами, как: ç, а, е, ... это, кажется, связано с моей входной поток, не кажется ли кодировать правильно, вот код:Проблемы с кодировкой вводаStream (Специальные символы: ñ, á, ...)

private static String sendPost(String url, Map<String, JSONObject> params) throws Exception { 
    String responseString; 

    StringBuilder urlParameters = new StringBuilder(400); 
    if (params != null) { 
     for (Entry<String, JSONObject> entry : params.entrySet()) { 
      urlParameters.append(entry.getKey()).append("=").append(entry.getValue().toString()).append("&"); 
     } 

    } 
    url += urlParameters.toString(); 
    url = url.replace(" ", "%20"); 
    URL obj = new URL(url); 
    HttpURLConnection con = (HttpURLConnection) obj.openConnection(); 
    con.setRequestMethod("POST"); 
    con.setRequestProperty("charset", "utf-8"); 
    con.setDoOutput(true); 
    int responseCode = con.getResponseCode(); 
    if (responseCode == HttpStatus.SC_OK) { 
     BufferedReader in = null; 
     StringBuffer response = null; 
     try{ 
      //when i check 'con' all seems to be fine 
      in = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8")); 
      String inputLine; 
      response = new StringBuffer(); 
      while ((inputLine = in.readLine()) != null) { 
       response.append(inputLine); 
      } 
     }finally{ 
      in.close(); 
     } 
     responseString = response.toString(); 
    } else { 
     responseString = new StringBuilder(25).append(responseCode).toString(); 
    } 
    return responseString; 
} 

Пример: Внутри «против» HTTP: \ direction.dom \ data \ WS \ something? param = {example: "castaña"}
и InputStream возвращает: http: \ direction.dom \ data \ WS \ something? param = {example: "casta a"}

Спасибо заранее.

+0

Что именно вам означает «InputStream возвращает»? Вы нарушаете символы в 'responseString'? Если да, то как вы определяете, что String нарушена (в отличие от того, что вы используете для просмотра String, например, для выхода файла журнала)? – Thilo

+0

Или специальные символы в URL * запроса *? Вероятно, они должны быть закодированы. – Thilo

+0

Какая кодировка используется веб-сервисом для записи в поток данных? Если вы не знаете, попробуйте «Cp1252». Это Windows-1252, который по умолчанию используется в Windows для западных стран. В противном случае вы можете попытаться записать необработанные байты из входного потока в файл и попытаться открыть его с помощью текстового редактора, надеясь, что редактор сможет угадать кодировку. – vanje

ответ

0

Мой партнер просто понять, как ее решить:

private static String sendPost(String url, Map<String, JSONObject> params) throws Exception { 
    String responseString; 

    StringBuilder urlParameters = new StringBuilder(400); 
    if (params != null) { 
     for (Entry<String, JSONObject> entry : params.entrySet()) { 
      urlParameters.append(entry.getKey()).append("=").append(entry.getValue().toString()).append("&"); 
     } 
    } 

    url = url.replace(" ", "%20"); 
    URL obj = new URL(url); 
    HttpURLConnection con = (HttpURLConnection) obj.openConnection(); 
    con.setRequestMethod("POST"); 
    con.setRequestProperty("accept-charset", "UTF-8"); 
    con.setRequestProperty("content-type", "application/x-www-form-urlencoded; charset=utf-8"); 
    con.setDoOutput(true); 

    DataOutputStream wr = new DataOutputStream(con.getOutputStream()); 
    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(wr, "UTF-8")); 
    writer.write(urlParameters.toString()); 
    writer.close(); 
    wr.close(); 

    int responseCode = con.getResponseCode(); 
    if (responseCode == HttpStatus.SC_OK) { 
     BufferedReader in = null; 
     StringBuffer response = null; 
     try{ 
      in = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8")); 
      String inputLine; 
      response = new StringBuffer(); 

      while ((inputLine = in.readLine()) != null) { 
       response.append(inputLine); 
      } 
     }finally{ 
      in.close(); 
     } 
     responseString = response.toString(); 
    } else { 
     responseString = new StringBuilder(25).append(responseCode).toString(); 
    } 
    return responseString; 
} 
0

Это очень сложный случай, потому что вы имеете дело с параметрами HTTP. Они могут быть в любой кодировке, которую пользователь вводит в ваш браузер.

На основании вашего примера ваш пользователь отправляет свои данные в чем-то, кроме UTF-8. Это может быть ISO-8859-1, ISO-8859-15 или windows-1252.

Вы можете нажать пользователей в сторону UTF-8, установив заголовок правильный HTTP для вашего веб-формы: response.setContentType("text/xml; charset=utf-8):

+0

Не отображается ли код «пользователь» (т. Е. Тот, кто делает запрос)? – Thilo

+0

Для разработки, да. Как только он поступит в производство, конечные пользователи не будут иметь доступа к этому коду. –

Смежные вопросы