过长的文本消息拆分-适用于微信消息推送

  • 场景提出
  • 代码示例
    • 拆分方法(代码片段):
    • 字节数占用的验证(代码片段)
    • 最后为简单结论

场景提出

故事要从微信消息推送说起,因为微信对文本消息的推送限定字节数为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个字节。

微信消息推送之过长的文本消息拆分踩坑相关推荐

  1. 消息推送技术干货:美团实时消息推送服务的技术演进之路

    本文由美团技术团队分享,作者"健午.佳猛.陆凯.冯江",原题"美团终端消息投递服务Pike的演进之路",有修订. 1.引言 传统意义上来说,实时消息推送通常都是 ...

  2. 友盟消息推送服务器demo,umeng友盟消息推送功能集成

    umeng友盟消息推送功能集成(本人使用的是eclipse开发) 1.首先请自行观看友盟消息推送集成的API文档. 观看地址如下: 2.集成步骤如下 下载sdk 注意:有两种sdk如果用户已经集成支付 ...

  3. 移动互联网消息推送原理:长连接+心跳机制(MQTT协议)

    互联网推送消息的方式很常见,特别是移动互联网上,手机每天都能收到好多推送消息,经过研究发现,这些推送服务的原理都是维护一个长连接(要不不可能达到实时效果),但普通的socket连接对服务器的消耗太大了 ...

  4. 微信消息推送神器pushplus介绍,让消息推送更简单

    很早之前曾经做过微信公众号消息推送,实现了一些有意思的小功能.如设备报警消息推送.每日天气预报和大盘资讯简报推送等,使用的是微信官方的api.后台使用golang做了个简单的服务,操作使用上是有点儿麻 ...

  5. 一加消息推送服务器,一加手机解释消息推送相关问题,或将尽快进行版本改善...

    3月15日消息,一加手机在近日对部分用户反馈的微信\QQ不能及时收到消息或消息推送的延迟问题进行了收集整理以及研究,为广大用户提供了相关解释说明. 在这份说明中,一加手机表示一些软件产生消息推送无法收 ...

  6. java消息推送怎么实现_PHP实现的消息实时推送功能

    本文实例讲述了PHP实现的消息实时推送功能.分享给大家供大家参考,具体如下: 入口文件index.html <!DOCTYPE HTML> <html> <head> ...

  7. webSocket 实现消息推送、心跳、已读消息、加载更多等功能

    读万卷书不如行万里路,行万里路不如阅人无数,阅人无数不如名师指路.站着巨人身上,你可以看的更高.更远. 一.webSocket 初始化 initWebSocket 方法中,初始化 webSocket. ...

  8. Android 消息推送 离线也可以收到通知消息

    1.老版本有问题 2.自定义可以,通知不可以(老版本自定义消息也收不到) 3.别的手机可以收到通知,但是没有收到通知的广播(我的旧版收不到通知,新版本也不可以) 4.运行demo 5..没有权限,也可 ...

  9. python 消息 推送服务器,从客户端发送字符串消息到服务器Python

    我无法运行我的代码,只要我将这些发送线添加到客户端和服务器中的recv行.我不知道什么是错的.没有他们,程序运行完美.我为了便于调试而粘贴了尽可能小的代码,因为如果没有这些代码,代码是完美的.从客户端 ...

  10. 抖音火爆的微信早安推送在线版,无需搭建代码,简单配置即可给心爱的他/她定时推送消息了

    抖音火爆的早安推送在线版,无需搭建代码,简单配置即可给心爱的他/她定时推送消息了 只需通过简单的配置,无需自己搭建代码环境,申请各种api,甚至保持电脑程序开机等.配置完成后,即可实现每天定时配送. ...

最新文章

  1. CVPR2020论文点评: AdderNet(加法网络)
  2. MPLS学习一些问题(一)
  3. hdu4400 BFS+STL
  4. python爬取动态网页的内容
  5. pmml_再访PMML
  6. LC和RC滤波电路分析
  7. 企业级内网的域控环境搭建教程
  8. cadence SPB16.6原理图库(.olb)集合的库内容列表2
  9. Cesium 加载自定义DEM数据
  10. java聊天室项目_java聊天室的项目的设计书.doc
  11. ifonts提取下载ttf文件
  12. DNS域名服务及常用国内DNS服务器地址
  13. 常见web中间件及其漏洞概述
  14. 将孤独视作挑战,倾听内心,自我对话
  15. 数码管——8段共阴极数码管
  16. php csv文件转json,php csv如何转json
  17. 数字IC后端实现40天速成篇(中)
  18. H3C CAS 5.0 虚拟机备份与还原
  19. 用户正确使用趋势跟随的交易系统的方法
  20. 已搭建独立博客,请移步下面网址

热门文章

  1. 中国石油大学c语言程序设计答案,中国石油大学《C语言程序设计》期末复习题和答案.doc...
  2. 递增的整数序列链表的插入_leetcode673_go_最长递增子序列的个数
  3. C语言中错误c213是什么意思,DS1302的错误:error c213
  4. 自适应巡航跟车距离怎么调_2020款奔驰GLS450改装原厂配件 ACC自适应巡航系统 香氛香薰负离子...
  5. java元数据是什么_Java和大数据是什么关系 杭州哪个就业前景更好
  6. python无法定位到table_selenium3 + python - table定位
  7. c语言从栈分配地址函数,C语言 子函数return局部变量和栈地址 机制
  8. java加密不可逆,32位不可逆加密算法Java实现
  9. java类中静态变量自增_Java中静态变量(类变量)、实例变量、局部变量和成员变量...
  10. 【牛客练习赛57:D】回文串(回文树求前/后缀最长回文子串)