由于工作需求的原因,需要给苹果的客户端推送消息,但是苹果服务器端对这个消息的内容做了限制,

最大只能发送256个字节,发送的方式是以json的方式,256指的是发送的时候json数据的字节数。

详情见:https://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/ApplePushService/ApplePushService.html#//apple_ref/doc/uid/TP40008194-CH100-SW1

我在程序里动态的截取消息内容的长度(包括生成的“,”、“""”和“[]”)然后用256减去不是消息内容的字节的长度,

由于消息内容是中文的,所以我就用String.getBytes().length来判断消息的长度,我用应用程序测试没有问题,

但是在项目里就有出现了超出最大字节数的异常,让我非常郁闷,我把发送的json的内容打印出来,然后在应用程序中Json数据.getBytes().length是275

而在项目中就是240,项目的服务器是weblogic10.3的,两个文件的编码都是utf-8,找了好久才发现项目中调试的时候他是按照一个汉字占两个字节算的,

而utf-8的编码的大部分汉字是占用了3个字节,这就是出现异常的原因了。最后的解决办法,直接获得字符串的长度然后*3就是他们占用的字节数量,但是还是感觉有点不太靠谱普,目前没有找到其他的解决办法。

消息推送的代码如下:

需要的jar包:

commons-lang-2.5.jar

javapns-jdk16-163.jar

log4j-1.2.15.jar

bcprov-jdk16-145-1.jar

不过还需要苹果的证书

public static void recieveNotice(String deviceToken,Notice notice,String key,List<String> list) throws Exception {
  //deviceToken是手机的设备编号,Notice 是通知的对象,String 这条通知内容对应的key,list 通知的内容这里放在了一个list中

PushNotificationManager pushManager = null;
try {
PayLoadCustomAlert alert2 = new PayLoadCustomAlert();
alert2.addLocKey(key);

PayLoad payLoad = new PayLoad();
payLoad.addBadge(1);
payLoad.addSound("default");
payLoad.addCustomAlert(alert2);

List<String> myList = new ArrayList<String>();
myList.add(notice.getNoticeid() + "");
myList.add(notice.getClaimid() + "");
myList.add(notice.getStatus()+"");
myList.add(notice.getClaimStatus()+"");
myList.add(DATE_FORMAT.format(notice.getCreateTime()));

payLoad.addCustomDictionary("p", myList);

String logTags = ",\"loc-key\":\"\"[]";
int temLength = payLoad.toString().getBytes().length+logTags.getBytes().length;//这个是没有添加数组的长度
System.out.println("没有添加之前:"+payLoad.toString()+"长度:"+payLoad.toString().getBytes().length);
int surplus = 256-temLength;//剩余可用的字节
List<String> temList = new ArrayList<String>();//临时的数组 用来存放可以显示的文字
boolean falg = true;//判断有没有价格
int i = -1;
if(list !=null && list.size()>0){
for(String str : list){
if(falg){
try {
Double.parseDouble(str);
surplus = surplus - str.length()-3;
temList.add(0,str);
i++;
continue;
} catch (Exception e) {
}finally{
falg = false;
}
}
int tem = str.length()*3+5;//“等”这个汉字占用了3个字节 “""”这个占用了2个字节 所以首先要把这五个的位子给算上
if(surplus>tem){
temList.add(str);
surplus = surplus- tem+2;//算上之后满足条件 把“等”这个占用的空间给去掉 让他参与下次运算 “,”占用一个字节 如果有下一个中间要有“,”分割 所以共去掉加3减1个字节
i++;
}else{
temList.set(i, list.get(i)+"等");
break;
}
}
alert2.addLocArgs(temList);//这里指的是价格,缺少的单证
}

System.out.println("添加之后:"+payLoad.toString()+"长度:"+payLoad.toString().getBytes().length);
Log.opLogger.info("iphone 获得的通知:"+payLoad.toString()+"长度:"+payLoad.toString().getBytes().length);

pushManager = PushNotificationManager.getInstance();
pushManager.addDevice("iPhone", deviceToken);

String certificatePath = Thread.currentThread().getContextClassLoader().getResource("").getPath()+ "push_p.p12";//证书存放的路径
String certificatePassword = "abcd";//证书的密码
pushManager.initializeConnection("gateway.sandbox.push.apple.com", 2195, certificatePath,certificatePassword,SSLConnectionHelper.KEYSTORE_TYPE_PKCS12);
Device client = pushManager.getDevice("iPhone");
pushManager.sendNotification(client, payLoad);
} catch (Exception e) {
e.printStackTrace();
Log.opLogger.error("Exception", e);
} finally {
pushManager.stopConnection();
pushManager.removeDevice("iPhone");
}

}

转载于:https://www.cnblogs.com/andysd/archive/2013/04/24/2748052.html

诡异的编码和字节长度相关推荐

  1. mysql gbk编码 字节数_MySql中UTF8和GBK编码中文字符长度问题

    2.设计函数,输入为一个字符串,里边包含中文.英文.数字等字符,编码为GBK.中文字符的编码规则假定为:双字节组成,高字节大于0x80,低字节任意.     a) 用常用语言(c/c++/php/ja ...

  2. javaScript模板字符串、严格模式、编码字节长度

    一.模板字符串 var str=`hello`模板字符串 模板语法`${变量}` ${简单运算} <script>// +号连接字符function test2(){var a=10var ...

  3. C--中文汉字占用字节长度(字符集和字符编码)

    中文汉字占用字节长度 一.字符集和字符编码 1.概念 2.英文字母和中文汉字在不同字符集编码下的字节数 二.环境对应的字符编码 1.Ubuntu16.04虚拟机 2.Notepad++ 三.sizeo ...

  4. MySQL字符集编码中,VARCHAR 字符长度与字节长度的理解

    MySQL中基于 UTF-8 字符集编码,VARCHAR 字符长度与字节长度的理解 UTF-8 字符集 utf8mb4 字符集 参考 UTF-8 字符集 在 mysql 4.1 及之前早期版本中,如果 ...

  5. C# 获取字符串长度 获取字符串字节长度

    获取字符串长度 string str = "ABCDadcf测试"; int l = str.Length; 获取字符串字节长度 public int ByteLength(str ...

  6. JAVA返回指定字符串的长度,Java截取指定字节长度的字符串

    在实际的项目中,我们后台的数据库是根据指定编码(如GBK)保存数据的,为防止操作数据库时,因字段值长度超过数据库定义的长度,须在JAVA甚至JS层面做长度的校验控制,如数据库定义的长度是varchar ...

  7. java String长度与varchar长度匹配理解(字符和字节长度理解)

    java String长度与varchar长度匹配理解(字符和字节长度理解) string中的length()长度,返回的是char的数量,每个char可以存储世界上任何类型的文字和字符,一个char ...

  8. php获取字符串商都_php strlen获取字符串字节长度和mb_strlen获取字符串个数长度的区别(strlen获取中文长度)...

    strlen获取字符串字节长度和mb_strlen获取字符串个数长度的区别,如果字符串是数字或者英文字母组成的话,它们2个的结果上体现不出区别,可是如果字符串是汉字组成的话它们2个的结果差异很大 重点 ...

  9. 【转】utf-8的中文是一个汉字占三个字节长度

    因为看到百度里面这个人回答比较生动,印象比较深刻,所以转过来做个笔记 原文链接 https://zhidao.baidu.com/question/1047887004693001899.html 知 ...

最新文章

  1. android多媒体图文混排,干货!!!Android富文本实现图文混排
  2. 世界在音乐中得到了完整的再现和表达。
  3. 全国计算机二级哪几门比较热,【热】全国计算机二级office难吗
  4. 转换一个字符串的编码消除乱码
  5. datatables data bind json
  6. 让数据更安全可用,阿里云存储多项新功能发布
  7. 【渝粤教育】电大中专电商运营实操 (24)作业 题库
  8. 概率论三大公式 排列组合
  9. 基于51单片机的超声波测距
  10. Bluetooth core 5.0 ---------- BR/EDR 安全简单配对(BR/EDR secure simple pairing)
  11. md5加密原理!!!【转】
  12. CV2的conda安装
  13. matlab 总谐波失真,分析谐波失真 - MATLAB Simulink Example - MathWorks 中国
  14. wildfly服务启动,关闭
  15. Window7和Ubuntu双系统 删除Ubuntu
  16. esp32 cam 从安装、烧录到成为webcam详细教程
  17. 移动互联网时代的四大特征
  18. 信公号刷量工具昨崩溃 大V“裸泳”阅读量打回原形
  19. 符文能量(Comet OJ - Contest #8) C
  20. Word术语A4(210×297)上、下3.8cm,左、右3.2cm,页眉、页脚3.0cm如何在LaTeX中设置

热门文章

  1. 华为联合北大、悉尼大学对 Visual Transformer 的最新综述
  2. 机器人视觉场景理解挑战赛
  3. 硕、博、 博后招生 | 加拿大卡尔加里大学智能空间信息实验室
  4. 开源极速的人脸跟踪-基于OpenTLD与RNet
  5. mysql groupby rullup_关于group by的深入理解(扩展到rollup,增强groupby,主要用于小计)
  6. 700 页的机器学习笔记火啦,图文生动形象
  7. 哈佛推出这款PyTorch工具包,10行代码训练“AI药神”模型
  8. linux mysql 挂马_linux服务器被挂马
  9. mysql 存储过程 预处理语句_用于预处理语句的MySQL存储过程游标
  10. # 畸变矫正_别让这个细节毁了你的照片,学会正确进行畸变调整