zoukankan      html  css  js  c++  java
  • 编码表

    一、编码表的由来

    计算机只能识别二进制数据,早期由来是电信号。

    为了方便应用计算机,让它可以识别各个国家的文字。

    就将各个国家的文字用数字来表示,并一一对应,形成一张表。

    这就是编码表。

    二、常见的编码表

    1.ASCII:美国标准信息交换码

                 用一个字节的7位可以表示

    2.ISO8859-1:拉丁码表,欧洲码表

               用一个字节的8位表示

    3.GB2312:中国的中文编码表

    4.GBK:中国的中文编码表升级,融合了更多的中文字符号

    5.Unicode:国际标准码,融合了多种文字,

                   所有文字都用两个字节来表示,java语言使用的就是Unicode。

    6.UTF-8:最多用三个字节来表示一个字符。

    ……

    无非就是字符和二进制之间的转换。

    public static void change()
    {
         String str="你好";
         //编码
         byte[] buf1=str.getBytes() //默认码表为GBK   -60 -29 -70 -61
          byte[] buf2=str.getBytes("utf-8") //   -28 -67 -96 -27 -91 -67
    
        //解码
         String s1=new String(buf1);
         String S2=new String(buf2,"utf-8");
         
    }

     如果编码正确,但是解码不正确,怎么办?

    public static void show()
    {
        string s="你好";
        //编码
        byte[] buf1=s.getBytes("gbk");
        //解码
        string s1=new String(buf1,"iso-8859-1");
        //打印出s1=????
        System.out.println("s1="+s1);
        //利用错码再编一次,得到正确的字节数组
        byte[] buf2=s1.getBytes("iso-8859-1");
        //利用正确的编码再解一次码,得到正确的字符
        string s2=new String(buf2,"gbk");
       //打印出“s2=你好”
        System.out.println("s2="+s2);
        
    }

    原理如下图:

    其实java开发中的Tomcat就是利用这个原理。Tomcat利用的是iso885901来进行编码和解码的,但是我们习惯于用gbk进行编码和解码,利用上述原理可以正确进行编码和解码。实现原理如下图:

    上述方法能成功,是因为iso8859-1是单字节编码,不影响原字节的长度。如果上例换成GBK和UTF-8两种编码表之间的转换,那么就不能实现了。首先因为UTF-8比较特殊,有可能一字节、二字节、三字节,如果找不到这种编码,就会给出-17 -65 -67三字节编码,改变了原编码字节长度,所以解码必须是错的。这一点要注意。

    GB2312中两个字节都是是1开头,所以两个字节转整数都是负数,但是GBK中第一个字节是1开头,第2个字节有可能是0开头,如字“琲”。

     在记事本中输入“移动”两个字,默认格式保存后再打开,是正常显示的。但是输入“联通”两个字,默认格式保存后再打开,显示不正常。因为联通两个字正好符合UTF-8规范,记事本认为这是一个UTF-8编码,所以打开文件时,采用UTF-8解码了,这就出现乱码了。

    UTF-8规范:

    一字节:0*******

    二字节:11****** 10******

    三字节:111*****  10******  10******

  • 相关阅读:
    .net 项目中cookie丢失解决办法
    .net core 时间格式转换
    .net core 分布式性能计数器的实现
    Netty实现原理浅析
    DotNetty项目基本了解和介绍
    xml解析
    StackExchange.Redis性能调优
    C#string转换为Datetime
    C# SocketAsyncEventArgs类
    Des 加密cbc模式 padding
  • 原文地址:https://www.cnblogs.com/jsddj/p/7692921.html
Copyright © 2011-2022 走看看