IO流之字符编码

在几乎所有的编程语言上全部都存在有字符编码的问题,计算机的基本组成就是0、1两个数字,那么在这两个数字上为了能够让计算机可以描述更多的信息内容所以才有了各种不同位表述逻辑,而在计算机中如果要想显示文字,那么就必须对文字进行编码,早期的编码采用的是ASCII码,但是这种编码基本上所能够描述就属于基本的字符,而后来的中文字符实际上会发现需要更长的编码范围才能够描述,所以本次的分析是围绕着中文编码的方式来进行处理的

将我们的一个程序以另外一种方式保存的时候,使用javac 和java命令执行程序,结果会报错,这就是我们的编码问题
在刚刚编写Java程序的过程里面,在不注意的情况下就有字符编码的问题,Windows里面默认的命令行只支持GBK编码,对于其他的编码是不支持的,即使是程序代码正确了,但是由于程序的编码是错误的,所以最终程序还是无法执行
在实际项日开发过程之中,比较常见的儿种编码类型如下
 GBK/GB2312:描述中文国标编码,其中GBK可以描述简休中文与繁休中文,而GB2312仅仅是简体中文;
ISO8859-1:国际的通用编码,可以描述任何文字,但是对于一些图形化的文字需要做出转码;
 UNICODE:是一种十六进制的编码,可以描述世界上的各种文字信息,包括单字节的或者是多字节的,但是有一个问题,并不是所有的文字都需要如此长的编码,例如:英文字母,如果也使用这种方式进行编码所占用的传输带宽就没有意义了(浪费我们的传输带宽)
 ·UTF編码:可以简单的理解为“ISO8859-1+ Unicode”(优势结合),在需要十六进制编码的时候就使用十六进制的长度,如果不需要则使用ISO8859-1的形式,这种编码更加适合于网络传输,而常用的规格就是“UIF8”编码

以后只要是在开发工具中编写程序代码,那么请一定要首先将开发工具中所有支持的编码全部更换为UTF-8编码,而如果要想正确的进行编码的配置,就需要首先知道当前系统中默认的编码类型是什么。

package com.sicau.demo;
public class CharacterEncoding {

    public static void main(String[] args) {
        System.getProperties().list(System.out);

    }
}

file.separator= file.encoding=UTF-8(通过IDEA工具获取)
file.encoding=GBK(命令行工具获取,windows命令行下面不能使用UTF-8编码的原因就在于此处)

实际上现在清楚了编码的定义之后,就可以很好的解释关于乱码的问题了,乱码的本质就在于:编码数据和解码数据不统一。

package com.sicau.demo;
import java.io.*;
public class CharacterEncoding {

    public static void main(String[] args) throws IOException {
        // System.getProperties().list(System.out);
        File file = new File("G:" + File.separator + "message.txt");
        OutputStream output = new FileOutputStream(file);

        String message = "这是乱码的测试学习";
        byte[] data = message.getBytes();
        output.write(data);
    }

}

现在程序是能够正常执行,正常显示的
此时在讲字符串转换为字节数组中并没有采用其他的编码,所以采用的就属于默认的编码,那么如果系统支持我们的默认编码的话,自然就可以得到正确的数据

范例:强制性将我们的输出内容转换为其他的编码(即以我们制定的编码格式输出内容,输出以后我们看看在windows系统平台上是不是乱码的

package com.sicau.demo;
import java.io.*;
public class CharacterEncoding {

    public static void main(String[] args) throws IOException {
        // System.getProperties().list(System.out);
        File file = new File("G:" + File.separator + "message.txt");
        OutputStream output = new FileOutputStream(file);

        String message = "这是乱码的测试学习";
        byte[] data = message.getBytes("ISO8859-1");
        output.write(data);
    }
}

当前的整体操作都不支持有这样的编码信息,所以最终所获得的内容就无法正确的进行编码处理,导致了乱码的产生。

猜你喜欢

转载自www.cnblogs.com/zrcblog/p/12526662.html