ITEEDU

用JAVA输出UTF-8编码的二进制码

import java.io.UnsupportedEncodingException;


/**
 * Test
 * @author douzh
 * @version 1.0
 *
 */
public class Test {
    public static void main(String[] args) throws UnsupportedEncodingException {
        byte[] bs="报".getBytes("utf8");
        System.out.print("utf-8:");
        for(int i=0;i<bs.length;i++){
            System.out.print(byte2binary(bs[i])+" ");
        }
        bs="报".getBytes("utf16");
        System.out.print("\nutf16:");
        for(int i=0;i<bs.length;i++){
            System.out.print(byte2binary(bs[i])+" ");
        }
        bs="报".getBytes("utf32");
        System.out.print("\nutf32:");
        for(int i=0;i<bs.length;i++){
            System.out.print(byte2binary(bs[i])+" ");
        }
    }
    
    /**
     *  返回一个字节的二进制串
     */
    public static String byte2binary(byte bt) {
        int n=bt;
        StringBuilder str = new StringBuilder();
        for (int i=0; i < 8;i++) {
            str.append(Math.abs(n % 2));
            n = n >> 1;
        }
        return str.reverse().toString();
    }
}

输出结果:

utf-8:11100110 10001010 10100101 
utf16:11111110 11111111 01100010 10100101 
utf32:00000000 00000000 01100010 10100101 

utf16结果好奇怪,多了两个字符。这其实是文件的BOM。

当一个软件打开一个文本时,它要做的第一件事是决定这个文本究竟是使用哪种字符集的哪种编码保存的。软件一般采用三种方式来决定文本的字符集和编码: 检测文件头标识,提示用户选择,根据一定的规则猜测 最标准的途径是检测文本最开头的几个字节,开头字节 Charset/encoding,如下表:

EF BB BF UTF-8 
FE FF UTF-16/UCS-2, little endian 
FF FE UTF-16/UCS-2, big endian 
FF FE 00 00 UTF-32/UCS-4, little endian. 
00 00 FE FF UTF-32/UCS-4, big-endian.

这两个字节只输出一次,为了说明这一点,我们输出下面的内容:

bs="报报".getBytes("utf16");

输出结果:

utf16:11111110 11111111 01100010 10100101 01100010 10100101 

看,是不是只输出了一次。JAVA还是很智能的。