字符编码

本文详细探讨了字符编码的概念,包括ASCII、Unicode和UTF-8等常见编码方式,解析了字符编码在不同系统和语言环境中的应用,以及如何解决乱码问题。通过阅读,读者将能深入了解字符与数字之间的转换原理,提升对文本处理的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                                                                                                                              点击此处返回总目录

 

一、字符编码表

      我们知道计算机底层数据存储的都是二进制数据,而我们生活中的各种各样的数据,如何才能和计算机中存储的二进制数据对应起来呢?常见的有以下几种码表:

 

1. ASCII码表

      老美们就把每一个字符和一个整数对应起来,就形成了一张编码表,老美他们的编码表就是ASCII表。

       ASCII码表只用到了一个字节的低7位,最高位为0。也就是说ASCII码表只有128个字符。分别由0~127来对应。

 

2. iso-8859-1

       拉丁文编码表。也是用一个字节来表示文字。用到了8位。

 

3. GB2312

       简体中文码表。这是比较早期的中文编码表。里面大概不到6000个文字。用两个字节表示,第一个字节是负数,第二个字节可能是正数。

 

4. GBK

    GB2312不够用,所以扩容成了GBK。大概有2万个中文汉字。用两个字节表示。第一个字节是负数,第二个字节可能是正数。

    只要安装了中文版操作系统,编码都是GBK的。

 

5. GB18030

     最新的中文码表,但是现在还没有正式启用。所以还是用的GBK。

 

6. unicode

       称为万国编码表。它里面容纳了全球所有的语言文字。它里面无论什么字,都用两个字节存储。

       java中的char类型,用的就是unicode码表,所以char占用两个字节,所以char类型也可以存储汉字。

       虽然java中的char类型是unicode来表示的,但是java中的字符串不是按照Unicode来表示的,字符串是按照系统默认码表来解析的。简体中文版字符串默认的码表是GBK。

 

7. UTF-8

       基于Unicode,这个编码表做得更标准,更优化。在utf-8里面,一个字节能表示的,绝对不用两个字节表示。所以这个编码表是我们后期开发经常用到的编码表。现在的互联网技术基本都是用utf-8。

 

总结:

能识别中文的编码表:unicode、utf-8、GBK

对于我们开发而言,常用的编码:utf-8、GBK、iso-8859-1

 

二、编码和解码

编码:字符串---->数字。通过getBytes()方法。                   【例1】

解码:数字---->字符串。通过new  String(Byte[])来得到。   【例2】

 

例1:编码

package cn.itcast.demo09;

public class Test {
    public static void main(String[] args) {
        String s = "abc";
        byte[] b = s.getBytes();
        for(byte i:b){
            System.out.print(i+" ");                  //97 98 99 
        }
    }
}

例2:解码

package cn.itcast.demo09;

public class Test {
    public static void main(String[] args) {
        byte[] b = {97,98,99};
        String s = new String(b);
        System.out.println(s);                        //abc
    }
}

 

 

三、汉字在不同编码表下的存储

不同的编码表,同一个汉字对应的编码是不一样的。比如:

GBK编码中,一个汉字对应2个字节。比如"刘"对应的编码为"-63 -11"。【实验1】【实验2】

但是在utf-8编码中,同样是"刘"对应的编码是"-17 -69 -65 -27 -120 -104"。【实验3】【实验4】(为什么是6个字节呢?)

 

实验1:

package cn.itcast.demo02;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class Test {
    public static void main(String[] args) throws IOException{
        InputStream is = new FileInputStream("e:\\aaa.txt");        //aaa.txt中存放的是"刘",aaa.txt大小为2个字节。
        byte[] b = new byte[2];
        is.read(b);
        
        System.out.println(b[0]);                                                  //-63
        System.out.println(b[1]);                                                  //-11
        
        is.close();
    }
}

在aaa.txt中存放汉字刘,显示aaa.txt为2个字节大小。运行程序读取字节,可以看到两个字节为-63、-11。

 

实验2:

package cn.itcast.demo03;

import java.io.FileOutputStream;
import java.io.IOException;

public class Test {
    public static void main(String[] args) throws IOException{
        FileOutputStream fis = new FileOutputStream("e:\\f.txt");
        fis.write(-63);
        fis.write(-11);
        
        fis.close();
    }
}

往f.txt中输入两个字节-63,-11,打开f.txt,显示的是"刘"。

 

实验3:

在aaa.txt中存放汉字刘,另存为utf-8编码,显示aaa.txt为6个字节大小。运行实验1的程序读取字节,可以看到6个字节为"-17 -69 -65 -27 -120 -104"。

 

实验4:

通过实验2的程序往f.txt中存放6个字节"-17 -69 -65 -27 -120 -104",显示f.txt为6个字节,打开之后看到"刘"。(疑问,这个地方不应该是乱码么??)

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值