String chinese = "中国";try {
System.out.println(new String(chinese.getBytes("8859_1"),"8859_1"));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}为什么打印为乱码?
System.out.println(new String(chinese.getBytes("8859_1"),"8859_1"));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}为什么打印为乱码?
我不清楚String()中的构造方法了
但用iso-8859-1进行编码再用iso-8859-1进行解码,就出现乱码。
class Test {
public static void main(String[] args) {
try {
// Java里面的每一个String都是UNICODE编码,而一个汉字是以双字节进行存储
String chinese = "中国"; // Java 中,String的getBytes()方法就是对特定的UNICODE编码的字符串按照给定的字符集进行编码
// 根据底层代码可知,若不指定时,会默认取当前系统的编码集若是指定了编码集则会查找是否有指定的编码集,
// 存在则进行编码,不存在则按照"ISO-8859-1"编码集进行编码
// (我的是GBK)
byte[] b1 = chinese.getBytes();
System.out.println("默认系统编码" + System.getProperty("file.encoding")
+ "转换的字节长度:" + b1.length);
for (int i = 0; i < b1.length; i++) {
System.out.println("十进制:" + b1[i] + "\t八位二进制:"
+ conversion(b1[i]));
}
System.out.println("================================"); // GB2312
byte[] b2 = chinese.getBytes("GB2312");
System.out.println("指定GB2312编码转换的字节长度:" + b2.length);
for (int i = 0; i < b2.length; i++) {
System.out.println("十进制:" + b2[i] + "\t八位二进制:"
+ conversion(b2[i]));
}
System.out.println("================================"); // UTF-8
byte[] b3 = chinese.getBytes("UTF-8");
System.out.println("指定UTF-8编码转换的字节长度:" + b3.length);
for (int i = 0; i < b3.length; i++) {
System.out.println("十进制:" + b3[i] + "\t八位二进制:"
+ conversion(b3[i]));
}
System.out.println("================================"); // ISO-8859-1
byte[] b4 = chinese.getBytes("ISO-8859-1");
System.out.println("指定ISO-8859-1编码转换的字节长度:" + b4.length);
for (int i = 0; i < b4.length; i++) {
System.out.println("十进制:" + b4[i] + "\t八位二进制:"
+ conversion(b4[i]));
}
System.out.println("================================"); // 单字节字符编码 ISO-8859-1 最简单的编码规则,每一个字节直接作为一个 UNICODE 字符。比如,[0xD6,
// 0xD0] 这两个字节,通过 iso-8859-1 转化为字符串时,将直接得到 [0x00D6, 0x00D0] 两个
// UNICODE 字符,即 '中'。
// 反之,将 UNICODE 字符串通过 iso-8859-1 转化为字节串时,只能正常转化 0~255 范围的字符。
// 所以下面的操作是不可逆的
System.out.println(new String(chinese.getBytes("ISO-8859-1"),
"ISO-8859-1"));
// 而根据不同字符集的编码规则不一样,所以下面的操作也会产生乱码
System.out.println(new String(chinese.getBytes("ISO-8859-1"),
"GB2312"));
System.out.println(new String(chinese.getBytes("UTF-8"), "GB2312"));
System.out.println(new String(chinese.getBytes("GBK"), "UTF-8"));
// 不指定编码取系统编码(测试环境为GBK)时,向其他编码转换也为乱码
System.out.println(new String(chinese.getBytes(), "UTF-8"));
// 特殊情况,GB2312编码集为GBK编码集的子集,不会乱码
System.out.println(new String(chinese.getBytes(), "GB2312"));
// 与系统字符集相同不会产生乱码
System.out.println(new String(chinese.getBytes(), "GBK")); } catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
} /**
* byte/short/char/int型变量转变为八位二进制字符串
*
* @param data
* @return
*/
public static String conversion(int data) {
String s = "";
int b = 1 << 31;
for (int i = 0; i < 32; i++) {
if ((data & b) != 0) {
s = s + "1";
} else {
s = s + "0";
}
b = b >>> 1;
}
return s.substring(s.length() - 8);
}}
十进制:-42 八位二进制:11010110
十进制:-48 八位二进制:11010000
十进制:-71 八位二进制:10111001
十进制:-6 八位二进制:11111010
================================
指定GB2312编码转换的字节长度:4
十进制:-42 八位二进制:11010110
十进制:-48 八位二进制:11010000
十进制:-71 八位二进制:10111001
十进制:-6 八位二进制:11111010
================================
指定UTF-8编码转换的字节长度:6
十进制:-28 八位二进制:11100100
十进制:-72 八位二进制:10111000
十进制:-83 八位二进制:10101101
十进制:-27 八位二进制:11100101
十进制:-101 八位二进制:10011011
十进制:-67 八位二进制:10111101
================================
指定ISO-8859-1编码转换的字节长度:2
十进制:63 八位二进制:00111111
十进制:63 八位二进制:00111111
================================
??
??
涓??
?й?
?й?
中国
中国
根据各字符集的编码表、编码范围及规则进行推算,就能得到
为什么乱码的原因了~