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

最大只能发送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. 喜闻乐见的const int *p、int* const p、const int* const p
  2. maven 插件的应用
  3. 史上最简单的SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)
  4. 【转】python装饰器
  5. 前端学习(3121):react-hello-react的总结state
  6. ubuntu6.06容易死机的一种解决方法
  7. html模态窗口调试,在模态窗口中显示HTML标记
  8. 计算机网络学习1-网络层次
  9. 计算机界 TOP 3 难题:“相等”是软件工程中许多重大问题的根源!
  10. ueditor编辑器图片自定义存放目录及路径修改
  11. mac启动rabbitmq_从0到1学习Flink—— Flink 读取 Kafka 数据写入到 RabbitMQ
  12. 计算机开机界面图片怎么修改,电脑win7系统怎么修改开机画面的方法
  13. word下禁止显示回车符号
  14. java dismiss_为什么我的dismiss()方法无法关闭自定义警报对话框
  15. android opengl 简书,Android OpenGL入门
  16. 面试字节跳动之感谢篇
  17. PADS(10)——添加过孔技巧
  18. 标准方程法(正规方程法)
  19. 督查督办抓铁有痕,推进决策落地生根
  20. 我与小娜(20):去LIGO,探秘光子接力赛

热门文章

  1. 招聘 | 深圳人工智能与机器人研究院 扩展现实研究中心
  2. 【IEEE出版】计算机多主题征稿,ICBASE 2020诚邀您投稿参会!
  3. HandAI开源项目,拉近人和摄影的距离:基于手势识别完成不同的拍摄行为
  4. Image inpainting 图像修补最新综述
  5. 收藏 | 深度学习调参有哪些技巧?
  6. 收藏 | 程序员必须掌握哪些算法?
  7. 推荐系统 | 引用量超过1000的52篇经典论文
  8. 物体检测 | 29篇顶会(刊)论文集
  9. NLP基础|中英文词向量评测理论与实践
  10. android alarmmanager定时任务,AlarmManager 实现定时任务