导航

Java IO流之中文乱码

Posted on 2011-09-01 01:51  Qamefay  阅读(26080)  评论(2编辑  收藏  举报

      相信有过学过JavaEE的人们都有遇到过中文乱码问题吧,最简单的就是表单数据提交时中文出现乱码,乱码难解决吗?其实不难,只要掌握好编码的设置,乱码神马的一边去。

      今天主要就讲讲一些常用的可以设置编码的函数的用法。讲一下常见的编码,例如ISO-8859-1,gbk,utf-8等,这三个就是最常见的了。首先,为了防止乱码,我们得先统一编码,然后出现乱码再通过一些函数来解决。

      下面讲讲常见的中文乱码解决方法和例子吧..既然说了表单数据出现中文乱码,那就顺便说说解决方法吧.

          函数:new String(byte[] data, String encoding);

        这个方法主要就是用于解决上面说的表单数据提交时出现中文乱码,这个方法通常与String.getBytes(String encoding)一起使用.

                用法:String str = new String(formMsg.getBytes("ISO-8859-1"),"utf-8");

      因为今天主要要讲一下IO流操作中易出现的中文乱码解决方法,所以就言归正传,说说我在学习中遇到的乱码问题和解决方法吧.

      首先,我们都知道Java的IO流中按字节分就有字节流和字符流之分,看字面意思就知道,字节流是按字节为单位来操作的,而字符流当然是按字符为单位来操作的咯,字节流一般是用来操作一些二进制文件,例如MP3文件,JPG等等。字符流呢?一般是用来操作一些文本文件。

      android中也有很多地方涉及到IO流操作,当然也有不少中文乱码问题。有一些细节没注意到就有可能导致乱码。

      首先讲讲字节流,先贴一方法吧。

         /*

	 * 读取文件

	 */

	public String readerFile(File f) {

		String str = "";

		FileInputStream fis = null;

		try {

			fis = new FileInputStream(f);

			byte[] b = new byte[512];

			int n;

			while ((n = fis.read(b)) != -1) {

				str = str + new String(b, 0, n);

				b = new byte[512];

			}

		} catch (Exception e) {

			e.printStackTrace();

		} finally {

			try {

				fis.close();

			} catch (Exception e) {

				e.printStackTrace();

			}

		}

		return str;

	}

  

      这个方法就是通过传进的File对象,读取里面的内容,返回一个字符串,如果你把这方法copy去读取含有中文的文件,无意外的话就会出现中文乱码,如果出现中文乱码,该如何解决呢?其实String类有提供方法解决,只要把str = str + new String(b, 0, n);改成str = str + new String(b, 0, n, "gbk");就可以解决了。

     上面的方法在一般情况下是可以读取中文了,但是,仔细想想,毕竟上面的方法是以字节为单位的,而一个中文占了两个字节,细心的同学应该已经想到了,上面的方法是一次读取512个字节,如果,一个中文刚好就占了第512个字节和第513个字节,你一次读512个字节,狠狠得把他们拆散了,重新new了一个新的字符串,你说乱码不乱码?

      所以说,操作含有中文的文件还是通过字符流来好了,字符流操作起来又快,虽然从字节流一步一步升级到字符流有点烦..

      还是先贴一方法吧。

   

         /* 

	 * 升级版读取文件

	 */

	public String readerFile(File f) {

		String str = "";

		String line = "";

		FileInputStream fis = null;

		InputStreamReader isr = null;

		BufferedReader br = null;

		try {

			fis = new FileInputStream(f);

			isr = new InputStreamReader(fis);

			br = new BufferedReader(isr);

			while ((line = br.readLine()) != null) {

				str = str + line;

			}

		} catch (Exception e) {

			e.printStackTrace();

		} finally {

			try {

				fis.close();

			} catch (Exception e) {

				e.printStackTrace();

			}

		}

		return str;

	}

  

      如果按上面方法写最后还是出现乱码,你会如何解决?在哪个地方设置正确的编码?

      你会学第一种方法?str = str + new String(line.getBytes("ISO-8859-1"),"gbk");?你自己去试试吧- -。

      那你会学第二种方法?str = str + new String(line,"gbk");?根本就没有这个方法...

      那到底要怎么解决?

      其实,Java里有很多地方可以设置编码,上面的解决方法只要把isr = new InputStreamReader(fis);改成isr = new InputStreamReader(fis,"gbk");就可以搞定了.

      Java中中文乱码的问题还很多,这只是皮毛,还有更多解决方法等着你去发现,记得分享...