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
相关产品推荐
相关产品推荐

