字符编码相关报告

字符编码相关报告

编码

  • 编码,包括字符转为字符集id的过程,以及id如何用二进制存储的过程。前者涉及了字符集例如ascii、unicode,后者则涉及了ascii、utf-8、gbk。主要用于计算、数据存储、传输文字数据。
  • 编码的原因:1.兼容:扩展字符集的时候还能兼容ASCII。2.高效:每个字符不固定长度,一般都小于32位,不用每个字符都是32位。
  • String a=“abc”:在系统内是以unicode表示,使用char表示,对于英文只需要8位ASCII码。不编码的原因是:无法便利字符串,由于UTF-8是变长,无法知道第几个byte对应哪个字符,需要根据byte数组重新解码,会消耗CPU导致遍历变慢。

编码实践

写一个文件 file.txt,写入英文字母“abc”,以及中文”你好”,合计五个字符,并用UTF-8存储。

如下:

file.txt

abc你好

任务:

  1. 首先自行写出该文件的二进制表示,写成 “01011001” 这样的01串形式。该步骤需要利用 https://unicode-table.com 该工具网站,可以查询每个字符在各类编码下譬如UTF-8 下的二进制表示。
  2. 其次,编写代码输出 file.txt 的二进制表示。
  3. 对比1和2中的二进制表示,他们应该一致。

代码

public static void main(String[] args)throws Exception
    {
        //按行读取文件
        File file = new File("C:\Users\lxh\Desktop\test.txt");
        BufferedReader br = new BufferedReader(new FileReader(file));

        String s;
        while ((s = br.readLine()) != null)
        {
            System.out.println(s);
            //分解每一个字符
            String[] split = s.split("");
            //对每一个字符进行UTF-8的编码
            for (String st:
                 split) {
                byte[] bytes = st.getBytes(StandardCharsets.UTF_8);
                //byte to binary array
                for (byte b :
                        bytes) {
                    String replace = String.format("%8s",
                        Integer.toBinaryString(b & 0xFF)).replace(' ', '0');
                    System.out.print(replace+" ");
                }
                System.out.println();
            }
        }
    }

结果

abc
01100001
01100010
01100011
你好
11100100 10111101 10100000
11100101 10100101 10111101

发表评论

电子邮件地址不会被公开。