字符编码方式(即转换为字节的方式)

Unicode符号集

  它包含了世界上所有的符号,并且每一个符号都是独一无二的.Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储.
  Java中字符是采用Unicode符号集

GB2312&GBK

  GB2312是国家制定的汉字编码标准,使用双子节进行编码,共收入6763个汉字和682个非汉字图形字符。GBK即对国标编码的扩展,在GB2312的基础上进行扩展形成的,使用双字节编码方式,共收入21003个汉字,从而大大满足了汉字使用的需要。
  不使用Unicode符号集

编码方式

  • ASCII码
      能表示128个字符,其中包括英文字符、阿拉伯数字、西文字符以及32个控制字符。它用一个字节来表示具体的字符,但它只用后7位来表示字符(2^7=128),最前面的一位统一规定为0
  • 扩展的ASCII码
      利用字节中闲置的最高位编入新的符号。比如,法语中的é的编码为130(二进制10000010),可以表示最多256个符号。但这时问题也出现了:不同的国家有不同的字母,因此,哪怕它们都使用256个符号的编码方式,代表的字母却不一样。
  • UTF-8
      UTF-8是在互联网上使用最广的一种unicode的实现方式。其他实现方式还包括UTF-16和UTF-32,不过在互联网上基本不用。重复一遍,这里的关系是,UTF-8是Unicode的实现方式之一.
      UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
    UTF-8的编码规:
    - 对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
    - 对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
    
       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
    
    例如:已知"严"的unicode是4E25(100111000100101),根据上表,可以发现4E25处在第三行的范围内(0000 0800-0000 FFFF),因此"严"的UTF-8编码需要三个字节,即格式是"1110xxxx 10xxxxxx 10xxxxxx"。然后,从"严"的最后一个二进制位开始,依次从后向前填入格式中的x(高位在前,低位在后),多出的位补0,得到"严"的UTF-8编码是"11100100 10111000 10100101",转换成十六进制就是0xE4B8A5。
常见说明
  • ANSI编码方式。对于英文文件是ASCII编码,对于简体中文文件是GB2312编码(只针对Windows简体中文版,如果是繁体中文版会采用Big5码)。
  • Unicode编码指的是UCS-2编码方式,即直接用两个字节存入字符的Unicode码。。
  • UTF-8编码,也就是上一节谈到的编码方法。
  • [UTF-8]和[带BOM的UTF-8]的区别就是有没有BOM(即文件开头有没有U+FEFF)。
import java.io.UnsupportedEncodingException;

public class Test {
	public static void main(String[] args) {
		String str = "c";
		char x = 'c';
		byte[] bytesStr = null;
		byte[] bytesChar = null;
		try {
			bytesStr = str.getBytes("utf-8");
			bytesChar = charToByte(x);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		System.out.println("String \"c\" 的bytes大小: " + bytesStr.length);
		//System.out.println(bytes1[1] + "\n" + bytes1[2] + "\n" + bytes1[3]);
		System.out.println("char \'c\' 的bytes大小:  " + bytesChar.length);
		System.out.println("char \'c\' 的高位byte和低位byte值: " + bytesChar[0] + "(" + (char)bytesChar[0] + "), " + 
																bytesChar[1] + "(" + (char)bytesChar[1] + ")");
	}
		
	public static byte[] charToByte(char c) {
		byte[] b = new byte[2];
		b[0] = (byte) ((c & 0xFF00) >> 8);
		b[1] = (byte) (c & 0xFF);   
		return b; 
	}
}

输出

String "c" 的bytes大小: 1
char 'c' 的bytes大小:  2
char 'c' 的高位byte和低位byte值: 0( ), 99(c)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值