2016-10-28 56 views
0

我正在开发带有后端的android应用程序,均在Java中,并通过Http Post进行通信。 当我发送包含非英文字符的请求时,后端可以很好地处理它们,但是当后端尝试返回非英文字符时,它们会收到'?'。 说我送的parmas "STR=שלום עולם"(希伯来文字符)从Http Post接收UTF-8响应

后端servlet示例:

public class DebugServlet extends HttpServlet { 
    @Override 
    public void doPost(HttpServletRequest req, HttpServletResponse resp) 
     throws IOException { 

     String param = req.getParameter("STR"); 

     log(param); //Prints שלום עולם, So receiving fine! 

     try(PrintWriter out = resp.getWriter()) { 
      out.print(param); 
     } 
    } 
} 

客户端代码:

private final static String CHARSET = "UTF-8"; 
public static void send(String server, String servletName, Map<String, String> params){ 
    try{ 
     URL url = new URL(server + servletName); 
     URLConnection connection = url.openConnection(); 

     HttpURLConnection conn = (HttpURLConnection) connection; 

     OutputStream os; 

     conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=utf-8"); 
     conn.setRequestMethod("POST"); 
     conn.setUseCaches(false); 
     conn.setDoInput(true); 
     conn.setDoOutput(true); 
     os = conn.getOutputStream(); 

     //Add parameters 
     BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, CHARSET)); 
     StringBuilder paramsSB = new StringBuilder(); 
     boolean isFirst = true; 
     for(Map.Entry<String,String> entry : params.entrySet()){ 
      if(isFirst) 
       isFirst = false; 
      else 
       paramsSB.append("&"); 
      paramsSB.append(URLEncoder.encode(entry.getKey(), CHARSET)); 
      paramsSB.append("="); 
      paramsSB.append(URLEncoder.encode(entry.getValue(), CHARSET)); 
     } 

     writer.append(paramsSB.toString()); 

     writer.flush(); 
     writer.close(); 
     os.close(); 

     int responseCode; 
     responseCode = conn.getResponseCode(); 

     if (responseCode != 200) 
      throw new RuntimeException("..."); 

     StringBuilder chain = new StringBuilder(""); 
     try(BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()))) { 
      String line = ""; 
      while ((line = rd.readLine()) != null) { 
       chain.append(line); 
      } 
     } 

     Log.d("MyTAG", chain.toString()); //Prints "???? ????", that's the problem 
    } catch (IOException e) { 
     // writing exception to log 
     throw new RuntimeException("..."); 
    } 
} 

谢谢:)

回答

2

您需要设置响应为HttpServletResponse编码UTF-8。默认编码是ISO_8859_1

// response.setContentType("text/plain"); 
    response.setCharacterEncoding("UTF-8"; 

    // Write utf-8 strings