MENU

微信开发踩坑之编码

July 30, 2019 • Read: 457 • Java

最近自己在开发微信订阅号,其中的一个功能是图片文字识别。但是微信对返回的文字长度是有限制的。新的微信开发文档里我没有找到长度限制是多少,但是在以前的文档里面规定的是长度不超过2048字节,注意是字节,如果长度超限,而后端有没有做相应处理,也没有返回“success”字符串,那么微信就会对用户的请求响应一个该公众号暂时不能提供服务。

​ Java中使用String的getBytes().length可以方便地计算字符串所占字节数。

public static void main(String[] args) throws UnsupportedEncodingException {
        System.out.println("英俊\n23d".getBytes("ISO8859-1").length);//6
        System.out.println("英俊\n23d".getBytes("GB2312").length);//8
        System.out.println("英俊\n23d".getBytes("GBK").length);//8
        System.out.println("英俊\n23d".getBytes("UTF-8").length);//10
        System.out.println("英俊\n23d".getBytes().length);//10
}

​从上面的输出可以看出采用ISO8859-1编码方式时,一个中/英文都只占一个字节;采用GB2312或GBK编码方式时,一个中文占两个字节;而采用UTF-8编码方式时,一个中文占三个字节。而当不指定编码时,采用的就是操作系统的默认编码方式,我的系统默认编码方式就是UTF-8。

​在向微信服务器返回消息时,采用了UTF-8,因为我将请求和回复的编码都设置成UTF-8防止乱码,采用UTF-8编码时,文本消息内容最多支持2047个字节,多一个都不给响应。其实问题并不在这里,既然微信有文本消息长度限制,那么我识别出来的文字很长怎么办,我该怎么返回给用户呢?我想到的解决方案是如果长度超过2047个字节,那么我就将文字内容写入一个txt文件然后上传到七牛云,用七牛云做对象存储,上传成功返回该txt文件的链接,再删除本地的txt,最后返回部分文字内容和七牛云的链接给微信服务器。

​愿景很美好,也成功返回了,可是自己测试时发现,在微信端打开链接显示的文字总是乱码,而且在Chrome乱码在360极速浏览器又是好的,这就跟浏览器默认的编码方式有很大关系。我一开始以为跟微信那边的文字编码有关系,然后试了将文本内容的写入用UTF-8、ISO8859-1,结果都不行,真是令人头疼。后来我仔细想了想,微信打开链接,应该使用了微信的内置浏览器,然后在链接页面往下拉,就会发现有段文字说明,大概意思是QQ浏览器X5内核提供支持。OK,QQ浏览器,无奈手机上下了个QQ浏览器,然后试了试用QQ浏览器打开以GB2312编码的文本,我丢,竟然正常显示...看来坑就在这里。果然,改成GB2312编码后一切就正常了。好吧,QQ浏览器,世界清静了。

Last Modified: October 19, 2020
Leave a Comment

已有 1 条评论
  1. 小菜鸡 小菜鸡

    我看我自己