编码表

 这篇博客讲得更加详细:https://www.cnblogs.com/davidwang456/p/7766956.html

【由来】

计算机早期只能识别二进制数据,早期由来是电信号,为了方便应用计算机,让它可以
识别各个国家的文字(也就是让计算机和生活中的文字产生对应关系)。就将各个国家的文字
用数字来表示,并一一对应,形成一张表。这就是编码表的由来。


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

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

ISO8859-1:拉丁码表。欧洲码表

用一个字节8位表示


GB2312:中国的中文编码表

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


由于各个国家都有对应的码表,国际组织为了融合各个国家的文字,就建立了一个通用的国际编码表Unicode
Unicode:国际标准码,融合了多种文字。
  所有文字都用两个字节来表示,java语言使用的就是unicode

UTF-8:最多用三个字节来表示一个字符。
U就是Unicode的意思,TF转换格式,8是按最低字节定义的,如果你的内容能用一个字节
装那就用一个字节装,一般一个字节都会装ASCII,如果一个字节装不下就用两个字节装,如果两个字节装不下就用三个字节装。

【简单的编码解码】


public class EncodeDemo{


    public static void main(String [] args){
    
       /**
    *字符串--->字节数组:编码
    *字符数组------>字符串:解码
    */
    String str="你好";
    byte [] buf=str.getBytes();//使用平台默认字符集

    printBytes(buf);//输出:-60 -29 -70 -61为什么是负数呢?因为一个中文两个字节,每个字节的高位都是1打头

        
    byte [] buf2=str.getBytes("UTF-8");//指定字符集

        printBytes(buf);//输出:-28 -67 -96 -27  -91  -67
    }

private static void printBytes(bytep[]buf){

for (byte b:buf){

    System.out.println(b);

}


}

}

【编码问题】

问题1:如果编码错了,是解不出来的。
如:String str="你好";
byte[]buf=str.getBytes("iso8859-1");
这样是无论如何都解码不了的。


问题2:如果编对了,解错了,可能有救

如:String str="你好";
byte[]buf=str.getBytes("gbk");
String s1=new String(buf,"iso8859-1");
System.out.println("s1-"+s1);
输出:????,四个问号,这四个问号不是真的都是问号,只是显示不出来而已
byte[]buf2=s1.getBytes("iso8859-1");

String s2=new String(buf,"gbk");
System.out.println("s2-"+s2);

这样就可以正确解码了

问题3:UTF-8乱码问题

如:String str="你好";
byte[]buf=str.getBytes("gbk");
String s1=new String(buf,"UTF-8");
System.out.println("s1-"+s1);
输出:???
byte[]buf2=s1.getBytes("UTF-8");

String s2=new String(buf,"gbk");
System.out.println("s2-"+s2);

输出:锟斤铐锟?

原因:
在UTF-8中未知字符会用固定的编码-17 -65  -67

编码都变了,所以再次解码时肯定不会得到正确的字符串的。

但是如果, str="谢谢";用上面的代码是可以回到正常的字符串的,因为在UTF-8有对应
的编码。

那为什么iso8859-1没事呢?
因为iso8859-1它是单字节编码,而UTF-8能识别三个字节

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值