这是我的第一篇博客,写的不好与不足的地方,请大家提出问题和意见,请大家支持。
下面以一个典型的java例子讲述一下字符集编码之间的转换等。代码比较长,但简单明了。
代码主要说明以下一些内容:
1.main1()方法(只调用):将”中文“二字以指定字符集(GBK)编码,一个汉字转换为两个GBK字符码(编码到byte序列)、输出,然后再通过GBK把byte序列解码为字符串(又得到中文)
2.main2()方法(只调用):将将”中文“二字以指定字符集(utf-8)编码,一个汉字转换为3个utf-8字符码(编码到byte序列)、输出,然后再通过utf-8把byte序列解码为字符串(又得到中文)
(1与2)总结:总结:中文以什么字符集转码,最后还要以该字符集转回,才能得到原中文
3.main3()方法(只调用):是进行 GBK-->utf-8-->GBK的转换,先以GBK字符集编码到byte序列、输出,再将得到的byte序列以utf-8字符集编码到byte序列(注意:这中间并没有发生数据丢失)、输出。utf-8是把一个汉字转化为三个字节,这时在想用GBK转回来的话,windows会按照每两个字节进行转化为GBK,这样就会出现3个乱字。(如果出现三个乱字,要先把乱字转回字符码,由GBK转回原来的,即转回utf-8下的字符码)最后通过utf-8把byte序列解码为字符串。
4.main4()方法(只调用):是进行GBK-->iso8859-1-->utf-8-->iso8859-1-->GBK的转换,道理也是和main3()方法雷同,main4()请读者结合注释请自行揣摩练习。
package Test;
public class TestB {
static String zhongwen = "中文";
static byte[] bytes = null;
public static void main(String[] args) throws Exception {
// GBK
//main1();
// utf-8
//main2();
// GBK-->utf-8-->GBK
//main3();
// GBK-->iso8859-1-->utf-8-->iso8859-1-->GBK
main4();
}
// GBK
public static void main1() throws Exception {
//使用指定字符集“GBK”将此字符串(以GBK的形式)编码到byte序列,并将结果存储到一个新的 byte 数组中。
//(GBK是把一个汉字转化为两个字符码)
bytes = zhongwen.getBytes("GBK");//通过字符集GBK将字符串编码为byte序列
for (int i = 0; i < bytes.length; i++) {
System.out.println(Integer.toHexString(bytes[i]));
}//共得到4个字符码
System.out.println(new String(bytes, "GBK"));//通过GBK把byte序列解码为字符串
}
// utf-8
public static void main2() throws Exception {
//使用指定字符集“utf-8”将此字符串(以utf-8的形式)编码到byte序列,并将结果存储到一个新的 byte 数组中。
//(utf-8是把一个汉字转化为3个字符)
bytes = zhongwen.getBytes("utf-8");//通过字符集utf-8将字符串编码为byte序列
for (int i = 0; i < bytes.length; i++) {
System.out.println(Integer.toHexString(bytes[i]));
}
System.out.println(new String(bytes, "utf-8"));//通过utf-8把byte序列解码为字符串
}
//-------------------------------------------------//
//总结:中文以什么字符集转码,最后还要以该字符集转回,才能得到原中文
//-------------------------------------------------//
// GBK-->utf-8-->GBK
public static void main3() throws Exception {
//GBK
bytes = zhongwen.getBytes("GBK");//通过字符集GBK将字符串编码为byte序列
System.out.println("--------GBK----------");
for (int i = 0; i < bytes.length; i++) {
//以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式
System.out.println(Integer.toHexString(bytes[i]));
}
//GBK->utf-8
bytes = zhongwen.getBytes("utf-8");//通过字符集utf-8将字符串(上一步GBK下的乱字)编码为byte序列
//注意:这中间并没有发生字节码的丢失
byte [] bytes_copy = bytes;
System.out.println("-------utf-8--------");
for (int i = 0; i < bytes.length; i++) {
System.out.println(Integer.toHexString(bytes[i]));
}
//错误的组装方法
//utf-8是把一个汉字转化为三个字节,这时在想用GBK转回来的话,windows会按照每两个字节进行转化为GBK,这样就会出现3个乱字
System.out.println("-------error GBK--------");
zhongwen = new String(bytes, "GBK");//通过GBK把utf-8序列解码为字符串
System.out.println("乱字:" + zhongwen);//转为三个乱字
//再把乱字转回字字符码
bytes = zhongwen.getBytes("GBK");//由GBK转回原来的,即转回utf-8下的字符码
for (int i = 0; i < bytes.length; i++) {
System.out.println(Integer.toHexString(bytes[i]));
}
//正确的组装方法
System.out.println("-------GBK--------");
System.out.println(new String(bytes, "utf-8"));//通过utf-8把byte序列解码为字符串
//System.out.println(new String(bytes_copy, "utf-8"));
}
// GBK-->iso8859-1-->utf-8-->iso8859-1-->GBK
public static void main4() throws Exception {
System.out.println(zhongwen);
//最开始是GBK
bytes = zhongwen.getBytes("GBK");
System.out.println("--------GBK字符码----------");
for (int i = 0; i < bytes.length; i++) {
System.out.println(Integer.toHexString(bytes[i]));
}
//被组装成了iso8859-1,new出的字符串对象有问题,但是字节内容没变
System.out.println("-------iso8859-1字符码--------");
zhongwen = new String(zhongwen.getBytes("GBK"), "iso8859-1");//把中文转化为iso8859-1输出
System.out.println(zhongwen);//得????四个问号,四个字符
bytes = zhongwen.getBytes("iso8859-1");
for (int i = 0; i < bytes.length; i++) {
System.out.println(Integer.toHexString(bytes[i]));
}
//转换成utf-8在网络上传输,一个byte(?)转换为两个字节,所以一共8个字节
bytes = zhongwen.getBytes("utf-8");
System.out.println("-------utf-8字符码--------");
for (int i = 0; i < bytes.length; i++) {
System.out.println(Integer.toHexString(bytes[i]));
}
//server端接收到utf-8,首先组装成iso8859-1,new出的字符串对象有问题,显示4个问号
System.out.println("-------server--iso8859-1字符码------");
zhongwen = new String(bytes, "utf-8");
System.out.println(zhongwen);
bytes = zhongwen.getBytes("iso8859-1");
for (int i = 0; i < bytes.length; i++) {
System.out.println(Integer.toHexString(bytes[i]));
}
//以iso8859-1得到字节,并组装成GBK
System.out.println("-------GBK字符码--------");
System.out.println(new String(bytes, "GBK"));
//整个过程就是汉字->GBK字符集码->还原汉字再以iso8859-1字符集码转->不还原,在iso8859-1的基础上转utf-8字符集码->
//在utf-8基础上还原一步,得到iso8859-1字符集码对应的字符串(????)和字符集码->(iso8859-1得到的是字节4个)在转为
//GBK(组装两个字节为一个字)显示字符串
}
public static void ____________________main() throws Exception {
System.out.println(System.getProperty("file.encoding"));
System.out.println(System.getProperty("user.language"));
System.out.println(System.getProperty("user.region"));
}
}