前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >乱码案件

乱码案件

作者头像
SecondWorld
发布2021-07-28 11:04:18
4790
发布2021-07-28 11:04:18
举报
文章被收录于专栏:Java开发者杂谈Java开发者杂谈

经过

代码语言:javascript
复制
  最近新做了一个需求,需要通过https远程调用第三方接口。之前也对接过一些接口,只不过之前对接的接口的报文编码格式基本上都是UTF-8,而这次对接的是GBK。
  一顿操作之后和对端的接口终于通了,不过却发现对方返回的报文出现一堆问号乱码。开始以为底层的实现没有做URLDecoder(实际上即使没做也不应该出现问号乱码),后面尝试了下发现不是这个原因。于是考虑可能是接收报文处理的地方没有使用正确的编码格式。
我们这边的处理应答码报文的工具类大概如下:
代码语言:javascript
复制
public class ResponseHandlerHelper {
    private Charset defaultCharset = StandardCharsets.UTF_8;
    public ResponseHandlerHelper() {
    }
    public ResponseHandlerHelper(Charset defaultCharset) {
        this.defaultCharset = defaultCharset;
    }
    public HttpEntity processResponse(HttpResponse response) throws IOException {
        StatusLine statusLine = response.getStatusLine();
        HttpEntity entity = response.getEntity();

        if (statusLine.getStatusCode() >= 300) {
			// 这里获取编码格式
            Charset responseCharset = getResponseCharset(entity);

            String result = EntityUtils.toString(entity, responseCharset);
            throw new HttpResponseException(statusLine.getStatusCode(), statusLine.getReasonPhrase() + ':' + result);
        }
        return entity;
    }

    public Charset getResponseCharset(HttpEntity entity) {
        ContentType contentType = ContentType.getOrDefault(entity);
		// 如果应答码报文没有指定编码格式,则使用默认的UTF-8
        Charset charset = contentType.getCharset();
        if (charset == null) {
            charset = defaultCharset;
        }
        return charset;
    }

    public File copy(InputStream content, File targetFile) throws IOException {
        try (BufferedInputStream inStream = new BufferedInputStream(content); OutputStream out = new BufferedOutputStream(new FileOutputStream(targetFile))) {
            byte[] buffer = new byte[8192];
            int bytesRead = -1;
            while ((bytesRead = inStream.read(buffer)) != -1) {
                out.write(buffer, 0, bytesRead);
            }
            out.flush();
            return targetFile;
        } 
    }
}

注意代码中加注释的地方。 找到原因:对方返回报文未指定编码格式导致使用了默认的UTF-8格式解码导致


后续

代码语言:javascript
复制
  其实到这里已经知道如何解决,就是自己指定默认的编码格式为GBK。不过想到之前有收藏过一张乱码原因的图,回头看了下有一个场景和这个正好相符(以GBK写中文UTF-8读)。这里贴出来,方便后续快速定位问题。
image
image
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-07-22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 经过
  • 后续
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档