Android通过JSON向PHP传递EditText字符串时的编码问题排查
解决Android EditText文本JSON发送到PHP的编码异常问题
我之前也踩过类似的编码坑,结合你的代码场景,给你几个精准的排查和解决方向:
1. 确保Android端JSON数据的UTF-8编码输出
你获取EditText文本的代码没问题,但JSON数据转字节流时必须明确指定UTF-8,避免系统默认编码干扰。如果是手动拼接JSON字符串,要这样处理:
String s = editText.getText().toString(); // 拼接JSON(如果用Gson/Jackson等库序列化更稳妥,能自动处理特殊字符转义) String jsonBody = "{\"content\":\"" + s + "\"}"; // 关键:转成UTF-8编码的字节数组 byte[] postData = jsonBody.getBytes(StandardCharsets.UTF_8); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "application/json;charset=UTF-8"); conn.setRequestProperty("Accept", "application/json"); conn.setDoOutput(true); // 直接写入字节数组,不要用Writer(避免默认编码干扰) OutputStream os = conn.getOutputStream(); os.write(postData); os.flush(); os.close();
如果用Gson这类JSON库序列化,默认就是UTF-8,会更安全:
Gson gson = new Gson(); Map<String, String> data = new HashMap<>(); data.put("content", s); byte[] postData = gson.toJson(data).getBytes(StandardCharsets.UTF_8);
2. PHP端正确读取JSON数据并设置编码
很多人在这里踩坑:当请求头是application/json时,PHP不会自动把数据解析到$_POST数组里,必须读取原始输入流;同时要确保PHP脚本的输出和处理都是UTF-8:
// 先设置响应编码为UTF-8 header('Content-Type: application/json; charset=utf-8'); // 读取原始JSON数据(关键!别用$_POST) $rawJson = file_get_contents('php://input'); // 解析JSON,第二个参数true转成关联数组 $data = json_decode($rawJson, true); // 检查解析是否成功 if (json_last_error() !== JSON_ERROR_NONE) { echo json_encode(['error' => 'JSON解析失败:' . json_last_error_msg()]); exit; } // 后续处理(比如存入数据库)也要确保数据库连接是UTF-8 // 比如MySQL:mysqli_set_charset($conn, 'utf8mb4');
3. 额外排查点
- 检查EditText的输入:可以在Android端用
Log.d("TAG", s)打印文本,或者转成十六进制字节看是否符合UTF-8编码,排除输入本身的问题; - 避免多余的编码设置:比如不要在HttpURLConnection里重复设置
Charset请求头,Content-Type里的charset=UTF-8已经足够; - 特殊字符处理:如果文本包含 emoji 或罕见字符,要确保PHP和数据库用
utf8mb4编码(比utf8支持更多字符)。
内容的提问来源于stack exchange,提问作者user2697355
相关产品推荐
相关产品推荐

