另一方面也可以利用String类的构造方法根据不同字符集的字节化字符数据产生一个字符串对象,其本质是从其它字符集编码向Unicode字符集编码转换的过程。例如:
view plaincopy to clipboardprint?
byte[] unicodeBytes = {(byte)0x4E, (byte)0x2D, (byte)0x56, (byte)0xFD};
System.out.println(new String(unicodeBytes, Charset.forName("unicode")));
byte[] gbkBytes = {(byte)0xD6, (byte)0xD0, (byte)0xB9, (byte)0xFA};
System.out.println(new String(gbkBytes, Charset.forName("GBK")));
byte[] utf8Bytes = {(byte)0xE4, (byte)0xB8, (byte)0xAD, (byte)0xE5, (byte)0x9B, (byte)0xBD};
System.out.println(new String(utf8Bytes, Charset.forName("UTF-8")));
byte[] unicodeBytes = {(byte)0x4E, (byte)0x2D, (byte)0x56, (byte)0xFD};
System.out.println(new String(unicodeBytes, Charset.forName("unicode")));
byte[] gbkBytes = {(byte)0xD6, (byte)0xD0, (byte)0xB9, (byte)0xFA};
System.out.println(new String(gbkBytes, Charset.forName("GBK")));
byte[] utf8Bytes = {(byte)0xE4, (byte)0xB8, (byte)0xAD, (byte)0xE5, (byte)0x9B, (byte)0xBD};
System.out.println(new String(utf8Bytes, Charset.forName("UTF-8")));
上例三个输出语句均输出“中国”二字。
上述两种转换过程,特别是Unicode字符集编码向其它字符集编码的转换过程中会出现转换失败的现象。转换失败时该Unicode码自动用0x3F代替。例如:
view plaincopy to clipboardprint?
public static void main(String[] args) {
String str = "中国";
printBytes("中国的BIG5编码:", str.getBytes(Charset.forName("BIG5")));
}
public static void printBytes(String title, byte[] data) {
// 同上例
}
public static void main(String[] args) {
String str = "中国";
printBytes("中国的BIG5编码:", str.getBytes(Charset.forName("BIG5")));
}
public static void printBytes(String title, byte[] data) {
// 同上例
}
上例的输出结果为:
中国的BIG5编码:
0xA4 0xA4 0x3F
其中“国”由于没有繁体中文BIG5字符集对应的编码值,所以会用0x3F表示。
特殊的字符集(ISO-8859-1)
ISO-8859-1是单字节字符集,是ASCII字符集的补充。通常情况下使用ISO-8859-1字符集进行字符串对象与字节化字符数据的互换操作与前述完全一致。例如:
view plaincopy to clipboardprint?
public static void main(String[] args) {
// 字符串“abc”
byte[] bytes = { (byte) 0x61, (byte) 0x62, (byte) 0x63 };
String str = new String(bytes, Charset.forName("ISO-8859-1"));
printBytes("ISO-8859-1编码:", str.getBytes(Charset.forName("ISO-8859-1")));
printBytes("UNICODE编码:", str.getBytes(Charset.forName("UNICODE")));
}
public static void printBytes(String title, byte[] data) {
// 同上
}
public static void main(String[] args) {
// 字符串“abc”
byte[] bytes = { (byte) 0x61, (byte) 0x62, (byte) 0x63 };
String str = new String(bytes, Charset.forName("ISO-8859-1"));
printBytes("ISO-8859-1编码:", str.getBytes(Charset.forName("ISO-8859-1")));
printBytes("UNICODE编码:", str.getBytes(Charset.forName("UNICODE")));
}
public static void printBytes(String title, byte[] data) {
// 同上
}
上例的输出结果为:
ISO-8859-1编码:
0x61 0x62 0x63
UNICODE编码:
0xFE 0xFF 0x00 0x61 0x00 0x62 0x00 0x63