关于android.jar里的java.net.URLEncoder.encode()和jdk里的java.net.URLEncoder.encode()出现的问题
2015-04-20 21:23
471 查看
问题:
最近做的项目中,因为要用到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,这个偷巧的方法完成.
代码:
最近做的项目中,因为要用到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,这个偷巧的方法完成.
代码:
static final String regEx = "[\\u4e00-\\u9fa5]+"; /**对数据内容为String的json字符串里的values里的汉字进行URLEncoding GBK的编码*/ public static String encodingSocketData(String socketData){ ///判断有没有中文 if ((!TextUtils.isEmpty(socketData)) && (socketData.getBytes().length != socketData.length())) { ArrayList<String> list = new ArrayList<String>(); Pattern p = Pattern.compile(regEx); Matcher m = p.matcher(socketData); while (m.find()) { list.add(m.group(0)); } for(int i=0;i<list.size();i++){ 16 String oldStr = list.get(i); String newStr = encoding(oldStr); socketData = socketData.replaceFirst(oldStr, newStr); } } return socketData; } /**主要处理字符串中汉字的编码,data必须是一个汉字或多个汉字相连的字符串形式*/ static String encoding(String data){ if(TextUtils.isEmpty(data)){ return data; }else{ KTLog.e("data>>>转码前>>"+data);//test int size = data.length(); String temp = null; byte[] arrays =null; try { arrays = (data+"1").getBytes(CCSParams.SocketParams.SOCKET_DATA_PARSE_FORMAT); String[] strArrays = SocketUtils.byteArray2HexStr(arrays, true).split(" "); StringBuffer strb = new StringBuffer(); for(int i=0;i<size*2;i+=2){ strb.append('%').append(strArrays[i]).append('%').append(strArrays[i+1]); } temp = strb.toString(); } catch (UnsupportedEncodingException e) { KTLog.e("encoding执行("+data+")异常", e); } return temp; } } public static String byteArray2HexStr(byte[] bArray, boolean format) { StringBuffer strb = null; if (null != bArray) { strb = new StringBuffer(bArray.length); for (int i = 0; i < bArray.length; i++) { String str = Integer.toHexString(0xFF & bArray[i]).trim(); if (str.length() < 2) { strb.append("0"); } strb.append(str); if (format) { strb.append(" "); } } } else { 63 return null; } return strb.toString().trim(); }
相关文章推荐
- 关于android.jar里的java.net.URLEncoder.encode()和jdk里的java.net.URLEncoder.encode()出现的问题
- android中,使用ant多渠道打包时出现Perhaps JAVA_HOME does not point to the JDK问题的解决方法
- 关于Android的百度地图demo出现java.lang.NoClassDefFoundError问题解析
- unity调用Android通过编译 java jar包出现问题解决和简单支付流程
- exe4j打包jar文件为exe文件出现的问题:The JAVA_HOME environment variable does not point to a working 32-bit JDK or JRE.
- Android开发,关于依赖库和JAR包的区别以及使用多个依赖库可能出现的问题(SlidingMenu、SwipeBackLib)
- 关于eclipse中android在创建之后R.java文件出现问题的解决办法
- 关于Android studio安装出现“ 'tools.jar' seems to be not in Android Studio classpath..."的问题
- [Android 笔记] ADT v17+读取工程写 lib 下jar 包出现 java.lang.NoClassDefFoundError 问题
- 关于使用google map程序中报java.lang.NoClassDefFoundError: android.net.NetworkConnectivityListener的问题
- 关于ubuntu 命令update-alternatives --config java 安装jdk出现不能选择版本问题!
- 安装AndroidStudio出现问题 JDK安装后 没有tools.jar 和dt.jar包的解决办法
- 关于android 导入jar包出现could not find .classpath的问题
- 关于android socket出现at java.net.DatagramSocket java.net.BindException at libcore.io.IoBridge.bind(IoBridge.java:89)等waring
- Java中JDK中path和classpath的设置相关问题(关于import自定义包和jar的问题)
- Android出现java.net.SocketException: Permission denied的问题
- Android出现java.net.SocketException: Permission denied的问题
- Android出现java.net.SocketException: Permission denied 的问题 ,Android连接网络
- 关于JAVA WEB中JDK与绿色免安装tomcat的配置可能出现的问题讲解
- Android出现java.net.SocketException: Permission denied的问题