没事用了下Uri.fromFile(new File("/aaa/白板.pdf")).toString() 结果却不是我要的,2个中文字 白板竟然成了百分号了。。无语,百度下找了下列子
我自己偷懒了,我去,我反正是保存这个路径的,我直接在 路径前加了个 file:/// 完事,也不用Uri了。。
下边是搜到的文章:http://blog.chinaunix.net/uid-21144244-id-446383.html
不过感觉对我不没啥用,我是android的。。
我先提及个问题:(具体什么原因 没有深入 就把解决方法给贴出来) 主要是JAVA和前台的交互
第一:我从uri传递中文到 java后台 出现乱码
第二:我从uri传递的特殊字符到后台 结果是空白字符
第三:我从uri中既传入了中文 也传输了 特殊字符
第三:AJAX从JAVA后台到 前台出现乱码
下面我们一一来介绍:
第一种情况:
包括有两种解决方案:
第一种方案:在JAVA后台通过 new String("".getbytes("iso8859-1"),'GBK');来解决
第二种方案:通过前台的两次escape 然后 后台 我引用人家写的一个类
public class EscapeUnescape { public static String escape(String src) { int i; char j; StringBuffer tmp = new StringBuffer(); tmp.ensureCapacity(src.length() * 6); for (i = 0; i < src.length(); i++) { j = src.charAt(i); if (Character.isDigit(j) || Character.isLowerCase(j) || Character.isUpperCase(j)) tmp.append(j); else if (j < 256) { tmp.append("%"); if (j < 16) tmp.append("0"); tmp.append(Integer.toString(j, 16)); } else { tmp.append("%u"); tmp.append(Integer.toString(j, 16)); } } return tmp.toString(); } public static String unescape(String src) { StringBuffer tmp = new StringBuffer(); tmp.ensureCapacity(src.length()); int lastPos = 0, pos = 0; char ch; while (lastPos < src.length()) { pos = src.indexOf("%", lastPos); if (pos == lastPos) { if (src.charAt(pos + 1) == 'u') { ch = (char) Integer.parseInt(src .substring(pos + 2, pos + 6), 16); tmp.append(ch); lastPos = pos + 6; } else { ch = (char) Integer.parseInt(src .substring(pos + 1, pos + 3), 16); tmp.append(ch); lastPos = pos + 3; } } else { if (pos == -1) { tmp.append(src.substring(lastPos)); lastPos = src.length(); } else { tmp.append(src.substring(lastPos, pos)); lastPos = pos; } } } return tmp.toString(); } public static void main(String[] args) { String tmp = "中文"; System.out.println("testing escape : " + tmp); tmp = escape(tmp); System.out.println(tmp); System.out.println("testing unescape :" + tmp); System.out.println(unescape("%u6211%u4eec")); } } |
然后用整个对它进行解码
第二种情况:
前台JS 通过encodeURIComponent() 进行一个编码 然后 后台 就可以得到 正确的特殊字符 而不是空白 eg:
"/Graduation/viewjob.do?method=all&type="+type+"&like="+encodeURIComponent(document.all.like.value)+"&time="+document.all.time.value
第三中情况:
既有中文也有特殊字符
"/Graduation/viewjob.do?method=all&type="+type+"&like="+encodeURIComponent(escape(document.all.like.value))+"&time="+document.all.time.value
后台就利用上面的类 进行一次 unescape就可以拉
第四种情况:
因为AJAX 传递通过UTF-8 所以从JAVA代码出去的时候 设置response.setCharacter("UTF-8");前台就可以得到正确的中文 而不是 乱码拉