首页 > 其他分享 >微信昵称乱码-解决方案

微信昵称乱码-解决方案

时间:2023-07-06 19:11:08浏览次数:50  
标签:openId return String 微信 昵称 getSnsUserInfo 乱码 UTF response

目录

背景

网页授权拉取用户信息时昵称乱码

原因:

调接口时未设置字符集,默认使用的字符集是 ISO-8859-1,该字符集不适合汉字和特殊字符

原来的代码

    /**
     * 网页授权之拉取用户信息
     *
     * @param accessToken 网页授权token(注意和公众号的token不一样)
     * @param openId      用户openId
     * @return
     */
    public @Nullable JSONObject getSnsUserInfo(String accessToken, String openId) {
        String requestUrl = StrUtil.format("https://api.weixin.qq.com/sns/userinfo?access_token={}&openid={}&lang=zh_CN", accessToken, openId);
        log.info("getSnsUserInfo 请求url:{}", requestUrl);
        try {

            String responseStr = restTemplate.getForObject(requestUrl, String.class);
            JSONObject response = JSON.parseObject(responseStr);
            log.info("getSnsUserInfo 响应:{}", response);
            boolean isSuccess = checkResponseIsSuccess(response, "getSnsUserInfo");
            if (isSuccess) {
                return response;
            }
        } catch (Exception e) {
            log.info("网页授权之拉取用户信息 异常:{}", e.getMessage());
        }
        return null;
    }

解决方案:

增量数据

发送请求时,指定字符集 UTF-8

完善后的代码

    /**
     * 网页授权之拉取用户信息
     *
     * @param accessToken 网页授权token(注意和公众号的token不一样)
     * @param openId      用户openId
     * @return
     */
    public @Nullable JSONObject getSnsUserInfo(String accessToken, String openId) {
        String requestUrl = StrUtil.format(SNS_USER_INFO_URL, accessToken, openId);
        log.info("getSnsUserInfo 请求url:{}", requestUrl);
        try {
            // 创建一个StringHttpMessageConverter,并设置字符集为UTF-8
            StringHttpMessageConverter stringConverter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
            stringConverter.setSupportedMediaTypes(Collections.singletonList(MediaType.TEXT_PLAIN));
            // 将StringHttpMessageConverter添加到RestTemplate的消息转换器列表中
            restTemplate.getMessageConverters().add(0, stringConverter);
            // 创建HttpHeaders对象,设置Accept头部的值为"text/plain;charset=UTF-8"
            HttpHeaders headers = new HttpHeaders();
            headers.setAccept(Collections.singletonList(MediaType.TEXT_PLAIN));
            headers.set(HttpHeaders.ACCEPT_CHARSET, "UTF-8");

            String responseStr = restTemplate.getForObject(requestUrl, String.class);
            JSONObject response = JSON.parseObject(responseStr);
            log.info("getSnsUserInfo 响应:{}", response);
            boolean isSuccess = checkResponseIsSuccess(response, "getSnsUserInfo");
            if (isSuccess) {
                return response;
            }
        } catch (Exception e) {
            log.info("网页授权之拉取用户信息 异常:{}", e.getMessage());
        }
        return null;
    }

历史数据

将字符集是 ISO_8859_1的昵称转换为 UTF-8

    @Test
    public void test(){
        String wrongEncodedString = "Má´\u0087á´\u0087á´\u009B ꦿá\u00AD\u0084 .";
        
        if (isISO88591(wrongEncodedString)) {
            String newStr = convertStrCharset(wrongEncodedString);
            System.out.println(newStr);
            //结果: Mᴇᴇᴛ ꦿ᭄ .
        }
    }

    private boolean isISO88591(String str) {
        byte[] byteArr = str.getBytes(StandardCharsets.ISO_8859_1);
        String convertedStr = new String(byteArr, StandardCharsets.ISO_8859_1);
        // 比较原始字符串和转换后的字符串是否相等
        return str.equals(convertedStr);


    }

    private String convertStrCharset(String str) {
        try {
            // 假设原始字符编码
            byte[] bytes = str.getBytes(StandardCharsets.ISO_8859_1);
            // 使用UTF-8重新编码为正常的字符串
            return new String(bytes, StandardCharsets.UTF_8);
        } catch (Exception e) {
            log.warn("convertStrCharset failed,errorMsg:{}", e.getMessage());
        }
        return str;
    }

ps:

ISO-8859-1并不适合表示所有语言的字符,特别是亚洲语言如中文、日文和韩文等。对于这些语言,需要使用其他字符集,例如UTF-8或UTF-16。通常更推荐使用Unicode字符集(如UTF-8)

标签:openId,return,String,微信,昵称,getSnsUserInfo,乱码,UTF,response
From: https://www.cnblogs.com/lyn8100/p/17533108.html

相关文章

  • ios系统微信浏览器打开H5,调用接口status = 0失败的问题?
    最近写了一个很简单的小项目,以为不会有什么问题,今天突然说出问题了,说ios用户打开没有请求到数据。经测试,安卓,pc,都没有问题,只有ios出问题了。因为这次的涉及到时间,我以为ios时间处理上出问题了,仔细看了看,并不是,于是开启了漫长的寻找bug的过程。使用vConsole查看接口请求情况,发现......
  • 如何实现Java 实现微信聊天的具体操作步骤
    Java实现微信聊天微信是一款非常流行的社交聊天应用程序,让人们可以通过文字、语音、图片和视频等多种方式进行交流。本文将介绍如何使用Java编程语言实现一个简单的微信聊天应用。准备工作在开始编写代码之前,我们需要先安装Java开发环境。你可以从[Oracle官方网站](建立服务器......
  • 2023-07-06 微信开发者工具上传代码,在体验版查看时发现小程序的一些全局字体样式不生
    前言:在less中使用【@样式变量】如:@global_color:var(--global_color,red);问题描述:在开发工具中字体样式能正常显示,预览扫码到真机上也能显示字体颜色,结果上传代码到了提样版就不行了,样式不生效。这里用到了一个var函数,“var()函数用于插入自定义的属性值,如果一个属性值在......
  • 微信公众号授权
    1.公众号后台配置授权域名比如(www.xiaozhu.com) 直接获取用户的openid前端created(){this.getCode();},methods:{getCode(){//APPID是公众号的appid//https://www.xiaozhu.com/index/test/get_openid授......
  • 微信小程序页面增加下拉刷新功能
     对应的json文件增加如下内容"enablePullDownRefresh":true,"onReachBottomDistance":50,"backgroundTextStyle":"dark","backgroundColor":"#6197FB" 2.对应的js增加函数onPullDownRefresh()和 onload是一个级别......
  • 解决微信H5的图片缓存问题
    一、缓存可以解决什么问题?他的缺点是什么?1、缓存可以解决什么问题:减少不必要的网络传输,节约宽带更快的加载页面减少服务器负载,避免服务器过载的情况出现2、缓存的缺点:占内存,有些缓存会被存到内存中页面更新不及时,使用过时的图片、样式文件3、总结来说:开发阶段需要频......
  • ios应用免签+微信双开
    一句话概括:用TrollStore自动加签安装微信ipa文件,实现ios上微信应用分身。工具:1.ios14.12.GTACarTracher这个应用程序并不是真正的GTACarTracker,而是伪装的TrollStoreHelper。GTA就是TrollStore的安装器3.TrollStore:巨魔ios免费自签工具,可以用来安装ipa文件,ipa......
  • 微信小程序开发避坑
    1.wx.showModal未报错,也未执行。title必须为string类型wx.showModal({title:res.statusCode,content:'错误码:'+res.statusCode,showCancel:false,complete(){isShow=false}})2.map组件移动marker闪烁不能直接......
  • C#使用企业微信群聊机器人API
    publicclassOperationResult{publicboolIsSuccess{get;set;}publicintErrorCode{get;set;}publicstringContent{get;set;}}OperationResultinternalstaticclassTextType{internalst......
  • 客服系统机器人源码-微信专属个人助理可对接GPT
    我们大家都见过很多微信机器人,对接了GPT以后效果非常好,可以作为微信群里的助理,帮助我们回答各种问题 现在我来分享一下微信机器人的源码,该源码是golang开发,可以实现模拟个人微信桌面版登录,监听到微信的各种消息。下面就是完整代码packagemainimport("fmt""gi......