java.net.url.jar_关于android.jar里的java.net.URLEncoder.encode()和jdk里的java.net.URLEncoder.encode()出现的问题...

问题:

最近做的项目中,因为要用到socket,所以难免就有编码的要"GBK",但是发 现在用android.jar里的java.net.URLEncoder.encode("汉字","GBK")做编码时发现会丢失最后一个汉字的一 半,如"闽"编码后成了"%C3"而不是正确的"%C3%d6",随后在另外一个java项目里demo,发现 java.net.URLEncoder.encode("汉字","GBK")不存在这个问题,就开始郁闷了...

尝试:

尝试1:发现jdk里的java.net.URLEncoder类里的实现和android.jar里的完全不一样,猜测是不是底层实现不一样才导致了上面的问题,随后将jdk里的java.net.URLEncoder类copy到我的项目里进行尝试,发现问题依旧,此思路尝试失败!

尝试2:通过发现可能是和不同的平台有关,我的项目使用的是android网络盒子,4.4.2,第三方厂商oem的系统,那别的android平台可以正确运行么?

开始尝试,使用另外一个小android项目里为java.net.URLEncoder.encode做了一个小demo的apk,在别的android手机上运行,发现可以正确运行,能得到正确的结果.说好的平台无关性么?原来还真和平台有关!!

问题原因:通过发现好像是String的getBytes()里使用了System.arraysCopy()这个native方法里将一个char的字节截取所致(具体也没太深究,等有空再来研究,项目急).

解决方案:

所 幸在这个项目里的传输数据只对汉字进行URLEncode,所以,做了一些工具将需要传输的数据中的汉字通过正则挑出,然后将汉字在使用编码前在这个只有 汉字的String后面加上随便一个String,如:"1",然后再取出时只要汉字部分的编码(这个编码也是个工具方法,只是将byte数组转化成十六 进制的字符串,然后将每个汉字的编码用空格隔开,再取的过程中使用String.spit()将每个汉字的编码形成String[]),然后将原来的 String的汉字和编码后汉字String进行replace,这个偷巧的方法完成.

代码:

1

2 static final String regEx = "[\\u4e00-\\u9fa5]+";3

4 /**对数据内容为String的json字符串里的values里的汉字进行URLEncoding GBK的编码*/

5 public staticString encodingSocketData(String socketData){6

7   ///判断有没有中文

8   if ((!TextUtils.isEmpty(socketData)) && (socketData.getBytes().length !=socketData.length())) {9     ArrayList list = new ArrayList();10     Pattern p =Pattern.compile(regEx);11     Matcher m =p.matcher(socketData);12     while(m.find()) {13       list.add(m.group(0));14     }15   for(int i=0;i

23 }24 /**主要处理字符串中汉字的编码,data必须是一个汉字或多个汉字相连的字符串形式*/

25 staticString encoding(String data){26   if(TextUtils.isEmpty(data)){27     returndata;28   }else{29     KTLog.e("data>>>转码前>>"+data);//test

30   int size =data.length();31   String temp = null;32   byte[] arrays =null;33   try{34     arrays = (data+"1").getBytes(CCSParams.SocketParams.SOCKET_DATA_PARSE_FORMAT);35     String[] strArrays = SocketUtils.byteArray2HexStr(arrays, true).split(" ");36     StringBuffer strb = newStringBuffer();37   for(int i=0;i

48 public static String byteArray2HexStr(byte[] bArray, booleanformat) {49   StringBuffer strb = null;50   if (null !=bArray) {51     strb = newStringBuffer(bArray.length);52   for (int i = 0; i < bArray.length; i++) {53     String str = Integer.toHexString(0xFF &bArray[i]).trim();54     if (str.length() < 2) {55       strb.append("0");56     }57     strb.append(str);58     if(format) {59       strb.append(" ");60     }61   }62   } else{63 return null;64   }65   returnstrb.toString().trim();66 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值