Java 字符集编码问题

byte与char

  在java中,byte和char对于非英文字符来说:

  byte类型占用1字节,也就是说单个byte类型的变量,占用内存8位,数据范围是-128~127,全部转换为正数时,表示范围是0~255,所以他的表示范围刚好是ASCII码的范围。单个byte类型的变量不能存ASCII之外的数据(比如中文字符),但是可以用多个byte组合之后存储其他字符集的数据。

  char类型占用2字节,也就是说单个byte类型的变量,占用内存16位,可以用来表示一个字符,注意这里说的是字符,而不是字节。一个字符,可以是ASCII中的某个字符,也可以是中文中的某个汉字。

// byte用来存单个字节
byte b = 'a';
//b = '中';  // 错误,'中'是char类型。

char c = 'a';
c = '中';

  

 

字符集

  在开发过程中,有些数据的编码格式会有有所不同,一般需要将其经过编码和解码之后,再使用,否则就会出现乱码的情况。

  常见的字符集,比如GBK,UTF-8,UTF-16,ISO-8859-1

  

 

数据的编码与解码

  可以调用getBytes()方法,传入对应的字符集,即可将数据编码为对应的字符集。如果没有传入字符集的话,会编码为平台默认的字符集格式。

  在解码的时候,可以调用String类的构造器进行解码,注意传入的解码字符集,需要和编码的字符集相同,否则仍会出现乱码。

import java.io.UnsupportedEncodingException;

public class Demo {
	public static void main(String[] args) {
		encodeData();
		decodeData();
	}
	
	/**
	 * 演示对数据进行编码
	 */
	public static void encodeData()  {
		String data = "这是数据abc";
		System.out.println(data.length());  // 7
		// 注意,length()方法返回的是字符串中字符的数量,而不是字符串的字节数
		// 在计算长度的时候,是按照utf8字符集来计算。
		
		// 通过getBytes()将数据按照平台默认的字符集进行编码。返回byte[]
		System.out.println(data.getBytes().length); // 15
		
		// 可以将数据编码为指定字符集,大小写随意,并且utf8或者utf-8都可以
		try {
			System.out.println(data.getBytes("gbk").length); // 11
			System.out.println(data.getBytes("utf-8").length);// 15
			
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} 
	}
	
	/**
	 * 演示对数据进行解码
	 */
	public static void decodeData() {
		byte[] encoded_data = null;  // 模拟收到其他编码格式的数据
		try {
			encoded_data = "abc数据".getBytes("gbk");
		} catch (UnsupportedEncodingException e1) {
			e1.printStackTrace();
		}
		
		// 使用String的构造器来实现decode
		// 注意decode的时候,要使用encode时的字符集,否则两个字符集不对应时,会出现乱码。
		try {
			
			String decoded_data = null; 
			decoded_data = new String(encoded_data, 0, encoded_data.length, "utf8");
			System.out.println(decoded_data);  // abc����
			
			decoded_data = new String(encoded_data, 0, encoded_data.length, "gbk");
			System.out.println(decoded_data);  // abc数据
			
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
	}
}

  

 

 

  

posted @ 2018-12-02 17:30  寻觅beyond  阅读(263)  评论(0)    收藏  举报
返回顶部