感谢分享 http://blog.sina.com.cn/s/blog_5342e45b01012fu2.html
在网上看到有朋友说,在Android编程中如果实现文件的上传下载过程中,如果遇到文件路径中有中文,比如/sdcard/测试文档.txt或者d:/计算机.xls就会抛出FileNotFoundException的异常,很多论坛中提示大家用URLEncoder.encode()方法来解决,但是很多人在尝试了该方法之后并没有很好的解决问题。
于是在跟同学交流一番后,鄙人小试一把终于解决了这个问题,在解决这个问题之前,我们先看一下有关的API,在String里面,有个getBytes(String charsetName)方法,使用指定的字符集将此String编码成为byte序列,提到了字符集的问题,同样在URLEncoder.encode(String s, String enc)中也提到了相同的概念,于是我们在取得解决方案之前查了一下常用字符集。在打开eclipse的时候,我们在窗口-首选项-常规-工作空间中看到了这个选项,于是发现文本文件编码为WINDOWS默认的GBK,
于是我们在服务端把从客户端那边传过来的字符串path,进行了如下处理:
String newPath = URLEncoder.encode(path, "GBK");
File file = new File(newPath);
但是发现结果还是不对,于是我们考虑是不是因为是Android客户端那边传来的中文编码有问题,测试的时候,在Android端直接对中文字符串进行了不同的编码方式,考虑到linux下面的编码方式为UTF-8,而Android的内核为linux,做了一下测试:
String test = "测试";
textView1.setText((new String(test.getBytes("GBK"))));
textView2.setText((new String(test.getBytes("UTF-8"))));
果然GBK出来的结果是乱码,于是,在考虑两遍编码方式不同的问题,我把eclipse中的文本文件编码改成了UTF-8以跟android设备匹配,之后在客户端对String格式的路径进行getBytes("UTF-8");再进行传输,测试顺利通过了。没想到操作系统不同,编码方式不同的问题成了一个障碍,另外多提一句,GBK中,一个汉字所占字节数是2,而UTF-8中,一个汉字所占字节数是3,有需要的朋友还要多多注意。