微信消息推送之过长的文本消息拆分踩坑
过长的文本消息拆分-适用于微信消息推送
- 场景提出
- 代码示例
- 拆分方法(代码片段):
- 字节数占用的验证(代码片段)
- 最后为简单结论
场景提出
故事要从微信消息推送说起,因为微信对文本消息的推送限定字节数为2048个,多出来的直接被砍掉。所以就想要对过长的文本消息进行拆分。
起初想的是用字节数据拆分,但是发现用字节数组拆分,会出现消息转化乱码的问题,原因其实也很好理解,因为不同字符占用的字节数不一样,所以简单的拆分又重新转换为String,就会出现将本来一个字符的上半个字节转换为一个字符,下半个字节转换为一个字符,这样就出现了乱码。
因此,我决定按字符去拆分,但是按字符去拆分:(最终pageSize取600)
代码示例
拆分方法(代码片段):
public List<String> splitMessageByChars(String message,int pageSize) {List<String> messages = Lists.newArrayList();char[] chars = message.toCharArray();for (int i = 0;i<chars.length;i=i+pageSize){int j = i + pageSize;String m ;if (j>chars.length){m = new String(chars,i,chars.length-i);}else {m = new String(chars,i,pageSize);}if (m.indexOf('\n')==0){messages.add(m.substring(1));}else {messages.add(m);}}return messages;
}
可以看到代码中对\n做了过滤,原因是微信的文本消息推送,如果你首字符为\n的话就会报错,所以就需要对消息首字符为\n的情况做单独处理。
字节数占用的验证(代码片段)
@Test
public void contextLoads() throws UnsupportedEncodingException {List<String> charsets = Lists.newArrayList();charsets.add(StandardCharsets.UTF_8.name());charsets.add(StandardCharsets.UTF_16.name());charsets.add(StandardCharsets.UTF_16BE.name());charsets.add(StandardCharsets.UTF_16LE.name());charsets.add(StandardCharsets.ISO_8859_1.name());charsets.add(StandardCharsets.US_ASCII.name());charsets.add("UTF-32");charsets.add("GBK");charsets.add("GB2312");charsets.add("unicode");List<String> ss = Lists.newArrayList();ss.add("测");ss.add("a");ss.add("aa");ss.add("aaa");ss.add("\n");ss.add("\\");for (String s : ss){//字节测试System.out.println("---------"+"字符:\t"+s+"\t-------");for (String cs : charsets){System.out.println("在"+cs+"编码下字节数为:"+s.getBytes(cs).length);}}}
执行结果
---------字符: 测 -------
在UTF-8编码下字节数为:3
在UTF-16编码下字节数为:4
在UTF-16BE编码下字节数为:2
在UTF-16LE编码下字节数为:2
在ISO-8859-1编码下字节数为:1
在US-ASCII编码下字节数为:1
在UTF-32编码下字节数为:4
在GBK编码下字节数为:2
在GB2312编码下字节数为:2
在unicode编码下字节数为:4
---------字符: a -------
在UTF-8编码下字节数为:1
在UTF-16编码下字节数为:4
在UTF-16BE编码下字节数为:2
在UTF-16LE编码下字节数为:2
在ISO-8859-1编码下字节数为:1
在US-ASCII编码下字节数为:1
在UTF-32编码下字节数为:4
在GBK编码下字节数为:1
在GB2312编码下字节数为:1
在unicode编码下字节数为:4
---------字符: aa -------
在UTF-8编码下字节数为:2
在UTF-16编码下字节数为:6
在UTF-16BE编码下字节数为:4
在UTF-16LE编码下字节数为:4
在ISO-8859-1编码下字节数为:2
在US-ASCII编码下字节数为:2
在UTF-32编码下字节数为:8
在GBK编码下字节数为:2
在GB2312编码下字节数为:2
在unicode编码下字节数为:6
---------字符: aaa -------
在UTF-8编码下字节数为:3
在UTF-16编码下字节数为:8
在UTF-16BE编码下字节数为:6
在UTF-16LE编码下字节数为:6
在ISO-8859-1编码下字节数为:3
在US-ASCII编码下字节数为:3
在UTF-32编码下字节数为:12
在GBK编码下字节数为:3
在GB2312编码下字节数为:3
在unicode编码下字节数为:8
---------字符: -------
在UTF-8编码下字节数为:1
在UTF-16编码下字节数为:4
在UTF-16BE编码下字节数为:2
在UTF-16LE编码下字节数为:2
在ISO-8859-1编码下字节数为:1
在US-ASCII编码下字节数为:1
在UTF-32编码下字节数为:4
在GBK编码下字节数为:1
在GB2312编码下字节数为:1
在unicode编码下字节数为:4
---------字符: \ -------
在UTF-8编码下字节数为:1
在UTF-16编码下字节数为:4
在UTF-16BE编码下字节数为:2
在UTF-16LE编码下字节数为:2
在ISO-8859-1编码下字节数为:1
在US-ASCII编码下字节数为:1
在UTF-32编码下字节数为:4
在GBK编码下字节数为:1
在GB2312编码下字节数为:1
在unicode编码下字节数为:4
最后为简单结论
'\n’是一个字符,占1个字节 汉字若是用UTF-8编码,占3个字节,特别的汉字占用4个字节 汉字若是用GBK编码,占2个字节。
汉字若是用UTF-16编码,占2个字节,特别的汉字占用4个字节字母若是用UTF-8编码,占1个字节。
字母若是用UTF-16编码,占2个字节。(至于下面代码中,a占4个,aa占6个,aaa占8个原因是,java在其中)
字母若是用UTF-32编码,占4个字节。 字母若是用GBK编码,占1个字节。 字母若是用GB2312编码,占1个字节。
微信消息推送之过长的文本消息拆分踩坑相关推荐
- 消息推送技术干货:美团实时消息推送服务的技术演进之路
本文由美团技术团队分享,作者"健午.佳猛.陆凯.冯江",原题"美团终端消息投递服务Pike的演进之路",有修订. 1.引言 传统意义上来说,实时消息推送通常都是 ...
- 友盟消息推送服务器demo,umeng友盟消息推送功能集成
umeng友盟消息推送功能集成(本人使用的是eclipse开发) 1.首先请自行观看友盟消息推送集成的API文档. 观看地址如下: 2.集成步骤如下 下载sdk 注意:有两种sdk如果用户已经集成支付 ...
- 移动互联网消息推送原理:长连接+心跳机制(MQTT协议)
互联网推送消息的方式很常见,特别是移动互联网上,手机每天都能收到好多推送消息,经过研究发现,这些推送服务的原理都是维护一个长连接(要不不可能达到实时效果),但普通的socket连接对服务器的消耗太大了 ...
- 微信消息推送神器pushplus介绍,让消息推送更简单
很早之前曾经做过微信公众号消息推送,实现了一些有意思的小功能.如设备报警消息推送.每日天气预报和大盘资讯简报推送等,使用的是微信官方的api.后台使用golang做了个简单的服务,操作使用上是有点儿麻 ...
- 一加消息推送服务器,一加手机解释消息推送相关问题,或将尽快进行版本改善...
3月15日消息,一加手机在近日对部分用户反馈的微信\QQ不能及时收到消息或消息推送的延迟问题进行了收集整理以及研究,为广大用户提供了相关解释说明. 在这份说明中,一加手机表示一些软件产生消息推送无法收 ...
- java消息推送怎么实现_PHP实现的消息实时推送功能
本文实例讲述了PHP实现的消息实时推送功能.分享给大家供大家参考,具体如下: 入口文件index.html <!DOCTYPE HTML> <html> <head> ...
- webSocket 实现消息推送、心跳、已读消息、加载更多等功能
读万卷书不如行万里路,行万里路不如阅人无数,阅人无数不如名师指路.站着巨人身上,你可以看的更高.更远. 一.webSocket 初始化 initWebSocket 方法中,初始化 webSocket. ...
- Android 消息推送 离线也可以收到通知消息
1.老版本有问题 2.自定义可以,通知不可以(老版本自定义消息也收不到) 3.别的手机可以收到通知,但是没有收到通知的广播(我的旧版收不到通知,新版本也不可以) 4.运行demo 5..没有权限,也可 ...
- python 消息 推送服务器,从客户端发送字符串消息到服务器Python
我无法运行我的代码,只要我将这些发送线添加到客户端和服务器中的recv行.我不知道什么是错的.没有他们,程序运行完美.我为了便于调试而粘贴了尽可能小的代码,因为如果没有这些代码,代码是完美的.从客户端 ...
- 抖音火爆的微信早安推送在线版,无需搭建代码,简单配置即可给心爱的他/她定时推送消息了
抖音火爆的早安推送在线版,无需搭建代码,简单配置即可给心爱的他/她定时推送消息了 只需通过简单的配置,无需自己搭建代码环境,申请各种api,甚至保持电脑程序开机等.配置完成后,即可实现每天定时配送. ...
最新文章
- CVPR2020论文点评: AdderNet(加法网络)
- MPLS学习一些问题(一)
- hdu4400 BFS+STL
- python爬取动态网页的内容
- pmml_再访PMML
- LC和RC滤波电路分析
- 企业级内网的域控环境搭建教程
- cadence SPB16.6原理图库(.olb)集合的库内容列表2
- Cesium 加载自定义DEM数据
- java聊天室项目_java聊天室的项目的设计书.doc
- ifonts提取下载ttf文件
- DNS域名服务及常用国内DNS服务器地址
- 常见web中间件及其漏洞概述
- 将孤独视作挑战,倾听内心,自我对话
- 数码管——8段共阴极数码管
- php csv文件转json,php csv如何转json
- 数字IC后端实现40天速成篇(中)
- H3C CAS 5.0 虚拟机备份与还原
- 用户正确使用趋势跟随的交易系统的方法
- 已搭建独立博客,请移步下面网址
热门文章
- 中国石油大学c语言程序设计答案,中国石油大学《C语言程序设计》期末复习题和答案.doc...
- 递增的整数序列链表的插入_leetcode673_go_最长递增子序列的个数
- C语言中错误c213是什么意思,DS1302的错误:error c213
- 自适应巡航跟车距离怎么调_2020款奔驰GLS450改装原厂配件 ACC自适应巡航系统 香氛香薰负离子...
- java元数据是什么_Java和大数据是什么关系 杭州哪个就业前景更好
- python无法定位到table_selenium3 + python - table定位
- c语言从栈分配地址函数,C语言 子函数return局部变量和栈地址 机制
- java加密不可逆,32位不可逆加密算法Java实现
- java类中静态变量自增_Java中静态变量(类变量)、实例变量、局部变量和成员变量...
- 【牛客练习赛57:D】回文串(回文树求前/后缀最长回文子串)