zoukankan      html  css  js  c++  java
  • 字节编码选取

    字节编码主要是对应二进制数字和字符串直接的转换,人通过字符串可很只管的知道输出要表达的意思。  

    对初学者而言,字节编码很难选取,  涉及不同编码的转换,更是头疼。本篇选择简单的几个编码方式进行加深记忆。

      选取几种常用的编码方式:

        UTF-8,GBK,UNICODE,ASCII 
     分别对字母,汉字进行编码

      通过几种编码方式对String进行编码后的内容、长度进行比较,看哪种最适合平时使用

    测试代码:

    package com.study.code;
    
    import java.io.UnsupportedEncodingException;
    import java.util.Arrays;
    
    public class CodeTest {
       //比较几种编码对 字母 和汉字 转换后占用存储的大小  
        public static void main(String[] args) throws UnsupportedEncodingException {
            System.out.println( "================ 字母test ===============" );
            String a = "test";
            System.out.println(  "默认      : " + a.getBytes().length +"  " + showByte(a.getBytes() ));
            System.out.println(  "utf-8     : " + a.getBytes("UTF-8").length +"  "  + showByte(a.getBytes("UTF-8") ));
            System.out.println(  "GBK       : " + a.getBytes("GBK").length +"  " + showByte(a.getBytes("GBK") ));
            System.out.println(  "UNICODE   : " + a.getBytes("UNICODE").length +"  " + showByte(a.getBytes("UNICODE") ));
            System.out.println(  "ASCII     : " + a.getBytes("ASCII").length +"  " +showByte(a.getBytes("ASCII") ) );
            System.out.println( "================ 汉字测试 ===============" );
              a = "测试";
            System.out.println(  "默认      : " + a.getBytes().length +"  " + showByte(a.getBytes() ));
            System.out.println(  "utf-8     : " + a.getBytes("UTF-8").length +"  "  + showByte(a.getBytes("UTF-8") ));
            System.out.println(  "GBK       : " + a.getBytes("GBK").length +"  " + showByte(a.getBytes("GBK") ));
            System.out.println(  "UNICODE   : " + a.getBytes("UNICODE").length +"  " + showByte(a.getBytes("UNICODE") ));
            System.out.println(  "ASCII     : " + a.getBytes("ASCII").length +"  " +showByte(a.getBytes("ASCII") ) );
        }
       
      //将二进制数组转换为字符串展示 public static String showByte(byte[] b){ String ret = ""; for(byte a : b){ ret += Integer.toBinaryString(a) .toString() ; //a 转为int 后再重新转为二进制数据 会生成32位 ,所以结果是32* 字节长度 } return ret; } }

      结果输出为:

    ================ 字母test ===============
    默认      : 4  1110100110010111100111110100
    utf-8     : 4  1110100110010111100111110100
    GBK       : 4  1110100110010111100111110100
    UNICODE   : 10  111111111111111111111111111111101111111111111111111111111111111101110100011001010111001101110100
    ASCII     : 4  1110100110010111100111110100
    ================ 汉字测试 ===============
    默认      : 6  111111111111111111111111111001101111111111111111111111111011010111111111111111111111111110001011111111111111111111111111111010001111111111111111111111111010111111111111111111111111111110010101
    utf-8     : 6  111111111111111111111111111001101111111111111111111111111011010111111111111111111111111110001011111111111111111111111111111010001111111111111111111111111010111111111111111111111111111110010101
    GBK       : 4  11111111111111111111111110110010111111111111111111111111111000101111111111111111111111111100101011111111111111111111111111010100
    UNICODE   : 6  1111111111111111111111111111111011111111111111111111111111111111110110110010111111111111111111111111111000101111111111111111111111111111010101
    ASCII     : 2  111111111111
    

      

    结论:

      ASCII  是最简单的西文编码方案,识别不了汉字,只能识别128 或256 种可能的字节。其余字符串会按照字符串长度填充1 ; 在英语中,用128个符号编码便可以表示所有,但是用来表示其他语言,128个符号是不够的.

      utf-8 

        

    如果一个符号只占一个字节,那么这个8位字节的第一位就为0。
    如果为两个字节,那么规定第一个字节的前两位都为1,然后第一个字节的第三位为0,第二个字节的前两位为10。如果是三个字节的话,那么第一个字节的前三位为111,第四位为0,剩余的两个字节的前两位都为10。
    按照这样的算法去思考一个中文字符的UTF-8是怎么表示的:一个中文字符需要两个字节来表示,两个字节一共是16位,那么UTF-8下,两个字节是不够的,因为两个字节下,第一个字节已经占据了三位:110,然后剩余的一个字节占据了两位:10,现在就只剩下11位,与Unicode下的两个字节,16位去表示任意一个字符是相悖的。所以就使用三个字节去表示非ANSI字符:三个字节下,一共是24位,第一个字节头四位是:1110,后两个字节的前两位都是:10,那么24位-8位=16位,刚好两个字节去表示Unicode下的任意一个非ANSI字符。这也就是为什么UTF-8需要使用三个字节去表示一个非ANSI字符的原因了!

    Unicode符号范围 | UTF-8编码方式
    (十六进制) | (二进制)
    --------------------+---------------------------------------------
    0000 0000-0000 007F | 0xxxxxxx
    0000 0080-0000 07FF | 110xxxxx 10xxxxxx
    0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
    0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
    utf-8中文3个字节,英文1个字节

      GBK
      全称《汉字内码扩展规范》  向下与 GB 2312 编码兼容,向上支持 ISO 10646.1国际标准
    gbk中文2个字节,英文1个字节;



  • 相关阅读:
    UNIX网络编程 第9章
    UNIX网络编程 第8章 基本UDP套接字编程
    UNIX网络编程 第7章 套接字选项
    UNIX网络编程 第6章 I/O复用:select和poll函数
    UNIX网络编程 第5章 TCP客户/服务器程序示例
    天神下凡
    藏宝图
    黑红树
    杀人游戏[中山市选2011]
    Monotonicity 2[POI2010]
  • 原文地址:https://www.cnblogs.com/heshana/p/13851558.html
Copyright © 2011-2022 走看看