计算机中储存的信息都是用二进制数表示的;而我们在屏幕上看到的英文、汉字等字符是二进制数转换之后的结果。通俗的说,按照何种规则将字符存储在计算机中,如'a'用什么表示,称为"编码"。
byte[] b = str.getBytes(charsetName);//编码
反之,将存储在计算机中的二进制数解析显示出来,称为"解码"。
String str = new String(bytes, charsetName);//解码
如同密码学中的加密和解密。在解码过程中,如果使用了错误的解码规则,则导致'a'解析成'b'或者乱码,charsetName为字符集,对应着一套字符编码规则。
String str =new String(bytes, charsetName);//使用charsetName字符集的编码规则对bytes字节数组进行解码
Charset.defaultCharset();//The default charset is determined during virtual-machine startup and typically depends upon the locale and charset of the underlying operating system.
ASCII编码:将ASCII字符集转换为计算机可以接受的数字系统的数的规则。使用7位(bits)表示一个字符,共128字符;但是7位编码的字符集只能支持128个字符,为了表示更多的欧洲常用字符对ASCII进行了扩展,ASCII扩展字符集使用8位(bits)表示一个字符,共256字符。JAVA中US-ASCII即标准ASCII,用7位表示一个字符。
GBK编码:字符有一字节和双字节编码,00–7F(0-127)范围内是一位,和ASCII保持一致,此范围内严格上说有96个文字和32个控制符号。
之后的双字节中,前一字节是双字节的第一位。总体上说第一字节的范围是81–FE(129-254)(也就是不含80和FF),第二字节的一部分领域在40–7E,其他领域在80–FE。
如果用ASCII编码方式以字节为单位来对GBK编码方式的字节数组进行解码,由于找不到对应的ASCII字符而产生乱码。
字符集(Charset):是一个系统支持的所有抽象字符的集合。字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。
字符编码(Character Encoding):是一套法则,使用该法则能够对自然语言的字符的一个集合(如字母表或音节表),与其他东西的一个集合(如号码或电脉冲)进行配对。即在符号集合与数字系统之间建立对应关系,它是信息处理的一项基本技术。通常人们用符号集合(一般情况下就是文字)来表达信息。而以计算机为基础的信息处理系统则是利用元件(硬件)不同状态的组合来存储和处理信息的。元件不同状态的组合能代表数字系统的数字,因此字符编码就是将符号转换为计算机可以接受的数字系统的数,称为数字代码。
更多字符集及字符编码详见:
http://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html