java处理乱码方式,java中文乱码怎么解决
java io乱码怎么办?java中IO及中文乱码问题
这是我第一次发这个博客,所以我一直在纠结怎么开始。我们就直奔主题吧,记录下我的一些总结经验。希望能从简单的学习开始,也希望能慢慢坚持下去,以后能写出更好更有意义的内容。
其实作品中中文乱码的问题并不多,因为公司为了方便开发有统一编码。但是我觉得有必要了解一下它的原理。
推荐:《java学习》
IO iostream,就面向对象而言,就是输入输出流对象,主要用来操作文件对象。那么我们来稍微讲一下文件的概念,也就是文件对象。在Java中,File并不是我们日常生活中的具体文件,而是一个path对象,比如File File=new File( D:\ \ AAA );这是一个文件对象,也许它代表一个文件夹,也许这个路径不存在,但是这段代码确实创建了一个代表这个路径的文件对象。这种写法就是不常用。因为我们通常更多的是对一段文字、一张图片等进行操作。如File f=new File( AAA . txt );
以上简单介绍了什么是IO和IO,File。接下来,我们来说说这些图片、文字、视频等信息是如何存储在我们的存储设备上的。
个人理解是,无论什么类型的文件,都是以二进制形式存储,最小单位是1字节,由8位和01组成。所以如果我们要复制一个文件,只需要对字节流进行操作,也就是把一个文件中的所有字节都取过来,写到另一个文件中就可以了。其实理论上是可以的,只是对角色文件比较特殊。
所以才会有中文乱码的问题。大家对ASCII码表都很熟悉,至少听说过。应该算是很早就出现的一种码表吧。起初只是用来表示26个英文字母和一些特殊符号(因为计算机只识别二进制,所以字符要用相应的字节代替,形成码表)。
但是随着计算机的发展,ASCII应该是不够的,很多国家都应该有自己的编码方案,所以出现了不同的编码表。常见的有GBK,UTF-8,但是jvm默认使用unicode,也就是2个字节代表一个汉字,UTF-8不一定,可能3个字节代表一个汉字,也可能更多。所以存在一个问题,即不同码表中对应同一汉字的字节码的数量和内容是不同的。
那么如何解决呢?
我们把一张图片从A盘复制到B盘,把A到B的所有字节都取过来就行了,但是同样的方法操作一段文字也是可以的,前提是A和B中的文字代码相同。因为图中不存在字节编码问题。但是想从网络或者服务器上转中文怎么办?光靠字节是实现不了的(因为遇到问题时我们无法手动改变文件的编码方式)。所以java提供了字符流对象,即在字节流的基础上增加编码设置来解决乱码问题。
事不宜迟,用几个小案例来说明:
1.首先在当前项目下创建aa.txt,bb.txt。aa写几个汉字就行了。我会发现两种方式都可以实现。
一、使用字符流
FileReader fr=new FileReader( aa . txt );
FileWriter fw=new FileWriter( bb . txt );
int c;
while((c=fr.read())!=-1){
fw . write(c);
}
fr . close();
fw . close();b .使用字节流
file inputstream fis=new file inputstream( aa . txt );
file output stream fos=new file output stream( bb . txt );
int b;
while((b=fis.read())!=-1){
fos . write(b);
}
fis . close();
fos . close();2.这时候如果aa的编码方式是UTF-8,我们把bb的编码改成GBK,也运行上面两种方式,都是乱码。
原因是两个文件的编码方式不同,导致中文的码表不一样,所以乱码。
3.所以当两边文件的编码方式不同时,我们可以在读写时指定文件对应的编码。
实现如下:
InputStreamReader ISR=new InputStreamReader(new file inputstream( aa . txt ), utf-8 );
output streamwriter OSW=new output streamwriter(new file output stream( bb . txt ), gbk );
char[]arr=new char[1024];
int len
while((len=isr.read(arr))!=-1){
String s=新字符串(arr,0,len);
system . out . println(s);
osw.write
}
ISR . close();
OSW . close();虽然代码很简单,还是简单解释一下吧。从API中,我们可以发现InputStreamReader和OutputStreamWriter都是操作符的对象。继续阅读和写作。
它主要用于将字节转换为字符,以及将字符转换为字节。因此,从构造中也可以发现,传入的字节流对象。Utf-8用于读取字节流并将其转换为字符,然后通过gbk对字符进行编码并转换为字节进行写入。
下面几行我就不解释了。都是基本方法。它是一个匿名的内部类对象,是一个装饰性的设计模式,可以简单的编写。
关于字节流和字符流其实有很多有用的类,比如缓冲InputStream,缓冲Reader等。这里就不再赘述了。
jvm和系统平台的编码就不再解释了。
可以用string试试,观察String在编译和运行时的字节码和编码问题。以上是java io乱码怎么做的细节。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。