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

JAVA RestTemplate接收UTF-16编码响应时字符串显示乱码问题求助

问题根因

你代码中手动实例化的StringHttpMessageConverter强制指定了UTF-8作为编码,而接口返回的响应头Content-Type明确携带了charset=utf-16,用UTF-8解码UTF-16编码的字节流就会产生全问号的乱码。


解决方案

方案1:调整StringHttpMessageConverter配置,支持自动识别响应编码

去掉硬编码的UTF-8参数,StringHttpMessageConverter默认会优先从响应的Content-Type头中读取charset值进行解码,你也可以手动指定兼容的编码类型:

restTemplate = new RestTemplate();
// 不强制写死编码,让转换器自动读取响应头的charset参数
StringHttpMessageConverter msgConv = new StringHttpMessageConverter();
// 手动添加UTF-16格式的JSON响应支持
msgConv.setSupportedMediaTypes(Arrays.asList(
    MediaType.APPLICATION_JSON,
    new MediaType("application", "json", StandardCharsets.UTF_8),
    new MediaType("application", "json", StandardCharsets.UTF_16)
));
restTemplate.getMessageConverters().add(0, msgConv);

// 后续请求代码保持不变即可

方案2:直接接收字节流自行解码

如果不想修改全局消息转换器配置,可以先以字节数组形式接收响应,再手动用UTF-16解码:

// 将响应类型修改为byte[].class
ResponseEntity<byte[]> postResultBody = restTemplate.exchange(prepareUrl(path), method, httpEntity, byte[].class, parameters);
// 手动用UTF-16解码字节流,如果存在大端小端不匹配问题,可替换为StandardCharsets.UTF_16BE或StandardCharsets.UTF_16LE
String result = new String(postResultBody.getBody(), StandardCharsets.UTF_16);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 07:06:03