相信有过学过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中中文乱码的问题还很多,这只是皮毛,还有更多解决方法等着你去发现,记得分享...