博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于android.jar里的java.net.URLEncoder.encode()和jdk里的java.net.URLEncoder.encode()出现的问题...
阅读量:2240 次
发布时间:2019-05-09

本文共 1892 字,大约阅读时间需要 6 分钟。

问题:
最近做的项目中,因为要用到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 static String 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
>>转码前>>"+data);//test30   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 = new StringBuffer();37   for(int i=0;i

 

转载于:https://www.cnblogs.com/enyusmile/p/4442701.html

你可能感兴趣的文章
Java中的IO流
查看>>
java中的关键字
查看>>
如果某个方法是静态的,它的行为就不具有多态性
查看>>
优化Hibernate所鼓励的7大措施
查看>>
Java 8系列之重新认识HashMap
查看>>
HashMap 、 ArrayList、String 重写了equals方法 而Object类(比如User)没有重写
查看>>
Servlet的生命周期
查看>>
Object中的getClass()返回的是当前运行的类
查看>>
加载驱动程序的方法
查看>>
深入理解java异常处理机制
查看>>
object类的基本方法
查看>>
回答阿里社招面试如何准备,顺便谈谈对于Java程序猿学习当中各个阶段的建议
查看>>
Dubbo分布式服务框架入门(附工程)
查看>>
两年Java开发工作经验面试总结
查看>>
作为Java面试官--谈谈一年来的面试总结
查看>>
两年Java程序员面试经
查看>>
面试心得与总结---BAT、网易、蘑菇街
查看>>
如何面试有2年java工作经验的应聘人员
查看>>
Java实现简单的递归操作
查看>>
面试Java程序员需具备的11个技能
查看>>