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(); } } }
如需转载,请注明文章出处,谢谢!!!