关于android.jar里的java.net.URLEncoder.encode()和jdk里的java.net.URLEncoder.encode()出现的问题
来源:互联网 发布:单片机将来工作 编辑:程序博客网 时间:2024/09/21 09:22
问题:
最近做的项目中,因为要用到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<String> list = new ArrayList<String>();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<list.size();i++){16 String oldStr = list.get(i);17 String newStr = encoding(oldStr);18 socketData = socketData.replaceFirst(oldStr, newStr);19 }20 }21 return socketData;22 23 }24 /**主要处理字符串中汉字的编码,data必须是一个汉字或多个汉字相连的字符串形式*/25 static String encoding(String data){26 if(TextUtils.isEmpty(data)){27 return data;28 }else{29 KTLog.e("data>>>转码前>>"+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<size*2;i+=2){38 strb.append('%').append(strArrays[i]).append('%').append(strArrays[i+1]);39 }40 temp = strb.toString();41 } catch (UnsupportedEncodingException e) {42 KTLog.e("encoding执行("+data+")异常", e);43 }44 return temp;45 }46 }47 48 public static String byteArray2HexStr(byte[] bArray, boolean format) {49 StringBuffer strb = null;50 if (null != bArray) {51 strb = new StringBuffer(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 return strb.toString().trim();66 }
0 0
- 关于android.jar里的java.net.URLEncoder.encode()和jdk里的java.net.URLEncoder.encode()出现的问题
- java.net.URLEncoder.encode编码解码
- java.net.URLEncoder.encode编码解码
- java.net.URLEncoder.encode编码解码
- java.net.URLEncoder和java.net.URLDecoder的使用和js 中编码(encode)和解码(decode)方法
- httpClient java.net.URLEncoder.encode二次转码问题
- httpClient java.net.URLEncoder.encode二次转码问题
- httpClient java.net.URLEncoder.encode二次转码问题
- java urlencoder.encode 和 htmlencoder
- java 要有URL.encode()和URLEncoder.encode()
- URLEncoder.encode的默认编码问题
- 关于URLEncoder.encode和URLDecoder.decode的用法
- jsp中使用java.net.URLEncoder.encode()传送字符编码
- jsp中使用java.net.URLEncoder.encode()传送字符编码
- JS decodeURI解码Java URLEncoder.encode编码的字符串不完全的问题
- android URLEncoder.encode和decode
- URLEncoder.encode与URLDecoder.docode的使用
- good -- URLEncoder.encode 和 URLDecoder.decode 处理url的特点
- 解决android EventBus 注册事件后但还无法相应事件的问题
- 解决android greenDAO没有默认值default value和没有原始数据类型的问题
- 解决Context.getExternalFilesDir(null)返回null造成java.lang.NullPointerException的问题
- 快速排序
- java 将一个字符串里连续两个及以上数字反转
- 关于android.jar里的java.net.URLEncoder.encode()和jdk里的java.net.URLEncoder.encode()出现的问题
- Intent传值的使用
- 链表的创建(带头节点以及不带头节点)
- linux图形界面开启与关闭
- FZU escape(两个bfs)
- 最长公共子序列
- java对上传图片缩放裁剪
- 网页页面 自动刷新的3种代码
- SQL 2008安装时反复提示重启和安装.net framework 3.5