/*
* 最早的编码是ISO-8859-1,和ASCII编码相似,属于单字节编码,最多能表示的字符范围是0-255,应用于英文系列。
* 比如,字母'a'的编码为0x61=97。
*
* 由于ISO-8859-1是单字节编码,和计算机最基础的表示单位一致,所以很多时候仍旧使用ISO-8859-1编码来表示,
* 而且在很多协议上,默认使用该编码。比如,虽然"中文"两个字不存在ISO-8859-1编码,以GB2312编码为例,应该
* 是"d6d0 cec4"两个字符,使用ISO-8859-1编码的时候则将它拆开为4个字节来表示:"d6 d0 ce c4"(事实
* 上,在进行存储的时候,也是以字节为单位处理的)。而如果是UTF编码,则是6个字节"e4 b8 ad e6 96 87"。
*
* GB2312/GBK是汉子的国标码,专门用来表示汉字,是双字节编码,而英文字母和ISO-8859-1一致(兼容ISO-8859
* -1编码)。其中GBK编码能够用来同时表示繁体字和简体字,而GB2312只能表示简体字,GBK是兼容GB2312编码的。
*
* Unicode是最统一的编码,可以用来表示所有语言的字符,而且是定长双字节(也有四字节的)编码,包括英文字母在内。
* 所以它不兼容ISO-8859-1编码,也不兼容任何编码。不过,相对于ISO-8859-1编码来说,Uniocode编码只是在
* 前面增加了一个0字节,比如字母'a'为"00 61"。
*
* 由于Unicode编码不兼容ISO-8859-1编码,而且容易占用更多的空间:因为对于英文字母,Unicode也需要两个
* 字节来表示。所以Unicode不便于传输和存储。因此而产生了UTF编码,UTF编码兼容ISO-8859-1编码,同时也可以
* 用来表示所有语言的字符,但UTF编码是不定长编码,每一个字符的长度从1-6个字节不等。另外,UTF编码自带简单的校验
* 功能。一般来讲,英文字母都是用一个字节表示,而汉字使用三个字节。
*
*
*/
package com.test;
import java.io.UnsupportedEncodingException;
public class TestCharset {
/**
* @param args
* @throws UnsupportedEncodingException
*/
public static void main(String[] args) throws UnsupportedEncodingException {
// TODO Auto-generated method stub
String str = "abcdef中文";
String strISO = null;
String str2 = null;
String charsetDef = "UTF-8";// UTF-8一般用3个字节表示一个汉字
// String charsetDef = "GBK"; // GBK用2个字节表示一个汉字
byte[] buf = null;
byte[] bufISO = null;
String encoding = System.getProperty("file.encoding");// 取得默认编码
System.out.println("file.encoding:" + encoding);// file.encoding:GBK
System.out.println();
// 根据默认编码转换
buf = str.getBytes();// 用默认编码解码
strISO = new String(buf, "ISO-8859-1");// 用新的编码生成字符串
System.out.println("strISO:" + strISO); // abcdef????
bufISO = strISO.getBytes("ISO-8859-1"); // 用新的编码解码
str2 = new String(bufISO, "GBK"); // 再回到默认编码
System.out.println("str2:" + str2); // abcdef中文
System.out.println();
// 根据指定编码转换
buf = str.getBytes(charsetDef);// 用指定编码解码
strISO = new String(buf, "ISO-8859-1");// 用新的编码生成字符串
System.out.println("strISO:" + strISO); // abcdef??????
bufISO = strISO.getBytes("ISO-8859-1"); // 用新的编码解码
str2 = new String(bufISO, charsetDef); // 再回到指定编码
System.out.println("str2:" + str2); // abcdef中文
System.out.println();
}
}
输出:
file.encoding:GBK
strISO:abcdef????
str2:abcdef中文
strISO:abcdef??????
str2:abcdef中文
注意:两个?号代表一个字节。