当前位置:首页 > 行业动态 > 正文

安卓传服务器中文乱码

解决安卓传服务器中文乱码需确保两端编码一致,如统一使用UTF-8,检查HTTP头及数据处理流程

安卓传输到服务器中文乱码问题分析与解决方案

问题现象描述

安卓客户端向服务器传输包含中文的数据(如JSON、表单参数、文件等)时,服务器端接收到的数据出现乱码,

  • JSON数据{"name":"张三"} 变成 {"name":"xe5x8cx97xe4xb8x89"}
  • URL参数?name=张三 变成 ?name=%E5%8C%97%E4%B8%89(未正确解码)
  • :中文文件名或内容显示为乱码(如???.txt

常见原因分析

可能原因 具体表现
客户端与服务器编码不一致 客户端使用UTF-8,服务器用GBK解析(或反之)
数据传输未正确编码 未对中文参数进行URL编码,或未指定Content-Type的字符集
服务器端解码逻辑错误 读取流时未指定字符集,或数据库存储时未设置编码
中间件/代理转发问题 网络代理或负载均衡器修改了请求头,导致字符集丢失

解决方案

确保客户端统一使用UTF-8编码

  • HTTP请求头设置
    OkHttpRetrofit中,明确指定Content-TypeAccept

    // OkHttp示例
    Request request = new Request.Builder()
        .url("https://server.com/api")
        .addHeader("Content-Type", "application/json; charset=utf-8")
        .addHeader("Accept", "application/json; charset=utf-8")
        .post(RequestBody.create(JSON, MediaType.parse("application/json; charset=utf-8")))
        .build();
  • 参数URL编码
    对GET请求的URL参数进行编码:

    String baseUrl = "https://server.com/api?name=" + URLEncoder.encode("张三", "UTF-8");

服务器端正确解码

  • Java/Spring Boot示例

    // 读取请求体时指定字符集
    String body = new String(request.getBody().bytes(), StandardCharsets.UTF_8);
    // 数据库连接URL添加字符集参数(MySQL示例)
    jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=UTF-8
  • Node.js示例

    安卓传服务器中文乱码  第1张

    // Express解析JSON时指定编码
    app.use(express.json({ charset: 'utf-8' }));
    // 解析URL参数时自动解码
    app.get('/api', (req, res) => {
      console.log(req.query.name); // 自动解码为"张三"
    });

数据库存储与查询

  • MySQL建表指定编码

    CREATE TABLE users (
      id INT PRIMARY KEY,
      name VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  • 查询时避免隐式转换
    避免使用castconvert函数导致编码错误。

文件传输处理

  • 安卓端读取文件

    安卓传服务器中文乱码  第2张

    // 以UTF-8读取文件内容
    String content = new String(Files.readAllBytes(path), StandardCharsets.UTF_8);
  • 服务器端保存文件

    // 保存文件时指定编码
    Files.write(filePath, content.getBytes(StandardCharsets.UTF_8));

验证方法

  1. 抓包工具检查
    使用CharlesWireshark查看HTTP请求头,确认Content-Type包含charset=utf-8

  2. 日志打印
    在客户端和服务器端打印原始字节数组,对比是否一致:

    安卓传服务器中文乱码  第3张

    // 客户端打印
    byte[] bytes = "张三".getBytes(StandardCharsets.UTF_8);
    System.out.println(Arrays.toString(bytes));
    // 服务器端接收后打印
    System.out.println(Arrays.toString(request.getBody().bytes()));
  3. 数据库直接查询
    通过数据库客户端工具(如DBeaver)直接插入中文,验证存储是否正常。


相关问题与解答

问题1:为什么POST请求的JSON中文乱码,但英文正常?

解答
JSON序列化时,安卓端可能未指定字符集(默认使用ISO-8859-1),导致中文字符被错误编码,需在RetrofitOkHttp中显式设置charset=utf-8


问题2:服务器返回的中文数据在安卓端显示乱码,如何解决?

解答

  1. 确保服务器响应头包含Content-Type: application/json; charset=utf-8
  2. 安卓端使用UTF-8解码响应体:
    String response = new String(responseBody.bytes(), StandardCharsets.UTF_8);
0