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();
}
}
}
如需转载,请注明文章出处,谢谢!!!
浙公网安备 33010602011771号