You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GsonBuilder toJson()非英文字符编码异常(Windows与Mac表现不一致)

解决Gson在Windows下处理非英文字符乱码的问题

看起来你遇到的是跨平台字符编码不一致导致的Gson序列化/反序列化乱码问题——Postman调用正常说明服务器端的编码处理没问题,问题大概率出在Windows客户端的Gson配置或者请求发送时的字符编码设置上。下面是具体的排查和解决步骤:

1. 显式指定Gson使用UTF-8编码

默认情况下,Gson在不同系统上会依赖系统默认字符集(Windows默认是GBK/GB2312,Mac是UTF-8),这就导致了跨平台的编码差异。你需要在创建Gson实例时强制指定UTF-8编码来统一行为:

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.nio.charset.StandardCharsets;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

// 创建Gson实例
Gson gson = new GsonBuilder()
    .setPrettyPrinting()
    .create();

// 序列化对象为JSON字符串,转字节流时强制用UTF-8
String jsonContent = gson.toJson(yourRequestObject);
byte[] jsonBytes = jsonContent.getBytes(StandardCharsets.UTF_8);

// 发送HTTP请求时,务必设置Content-Type头指定UTF-8
HttpURLConnection conn = (HttpURLConnection) new URL(yourApiUrl).openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
conn.setDoOutput(true);
try (OutputStream os = conn.getOutputStream()) {
    os.write(jsonBytes);
    os.flush();
}

重点注意:

  • 不要直接用jsonContent.getBytes()(默认会用系统字符集),必须显式指定StandardCharsets.UTF_8
  • HTTP请求头一定要加上charset=UTF-8,明确告诉服务器你发送的内容编码格式

2. 客户端接收响应时也强制用UTF-8解析

如果你的Windows客户端还需要接收服务器返回的非英文字符,同样要确保用UTF-8解析响应流:

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

try (InputStream is = conn.getInputStream();
     BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) {
    StringBuilder responseBuilder = new StringBuilder();
    String line;
    while ((line = br.readLine()) != null) {
        responseBuilder.append(line);
    }
    YourResponseObject responseObj = gson.fromJson(responseBuilder.toString(), YourResponseObject.class);
}

3. 验证系统默认编码差异

你可以在Windows客户端打印系统默认编码,确认是否是UTF-8导致的问题:

import java.nio.charset.Charset;

String testStr = "Εισιτήρια pri...";
System.out.println("Windows系统默认编码:" + Charset.defaultCharset().name());
System.out.println("字符串用UTF-8编码的字节长度:" + testStr.getBytes(StandardCharsets.UTF_8).length);
System.out.println("字符串用系统默认编码的字节长度:" + testStr.getBytes().length);

如果输出的默认编码不是UTF-8,就坐实了是系统编码差异引发的乱码。

为什么Postman没问题?

因为Postman默认会用UTF-8编码发送请求,并且自动设置Content-Type: application/json; charset=UTF-8请求头,服务器能正确识别编码格式,所以不会出现乱码。


内容的提问来源于stack exchange,提问作者user1614862

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:31:12