java - 从 Http Post 接收 UTF-8 响应

标签 java android

我正在开发带有后端的 Android 应用程序,都是用 Java 编写的,并通过 Http Post 进行通信。 当我发送包含非英语字符的请求时,后端可以很好地获取它们,但是当后端尝试返回非英语字符时,它们会收到“?”。 假设我发送为 parmas "STR=שלום עולם" (希伯来语字符)

后端示例 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("...");
    }
}

谢谢:)

最佳答案

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

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

    // Write utf-8 strings

关于java - 从 Http Post 接收 UTF-8 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40308691/

相关文章:

android - 为什么 SPAN_EXCLUSIVE_EXCLUSIVE 跨度在某些设备中不能有零长度错误

android - 市场上有 Ad 和 Adfree Android 应用程序,但在手机上会被覆盖

java - 用于SQL和性能的Grails 3.0日志记录和监视工具

java - 用于编写 Tensorflow TFRecords 数据文件的纯 Java/Scala 代码

java - 限制可以同时连接到服务器的客户端数量

android - Bitmapfactory.decodeStream 抛出 FileNotFoundException

java - 更新 Mongodb-dataneucleus 中的文档

java - Java 中的图像响应 - HTTPServer

android - 构建应用程序时出现警告 : "Expected stack map table for method with non-linear control flow."

android - android中如何突出显示imageview