这篇学习笔记,主要是讲解字符编码的常见问题:
/*
* 在java中字符编码经常出现,尤其在javaweb中出现乱码是时常发生的,为了弄清楚编码到底是怎么回事,避免以后再出现错误;
*
* 常识普及:
* ASSCII:在计算机内部,所有的信息最终都表示为一个二进制的字符串。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出 256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从 0000000到11111111。
上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码,一直沿用至今。
* GBK:
GBK即汉字内码扩展规范,K为扩展的汉语拼音中“扩”字的声母。英文全称Chinese Internal Code Specification。GBK编码标准兼容GB2312,共收录汉字21003个、符号883个,并提供1894个造字码位,简、繁体字融于一库。GB2312码是*国家汉字信息交换用编码,全称《信息交换用汉字编码字符集——基本集》,1980年由国家标准总局发布。基本集共收入汉字6763个和非汉字图形字符682个,通行于*。新加坡等地也使用此编码。GBK是对GB2312-80的扩展,也就是CP936字码表 (Code Page 936)的扩展(之前CP936和GB 2312-80一模一样)。
* GBK-2312:
* 至于亚洲国家的文字,使用的符号就更多了,汉字就多达10万左右。一个字节只能表示256种符号,肯定是不够的,就必须使用多个字节表达一个符号。比如,简体中文常见的编码方式是GB2312,使用两个字节表示一个汉字,所以理论上最多可以表示256x256=65536个符号
* UNICODE:
* UTF-8:
* 互联网的普及,强烈要求出现一种统一的编码方式。UTF-8就是在互联网上使用最广的一种unicode的实现方式。其他实现方式还包括UTF-16和UTF-32,不过在互联网上基本不用。重复一遍,这里的关系是,UTF-8是Unicode的实现方式之一。
UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
UTF-8的编码规则很简单,只有二条:
1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
*
*
*
*
*
*
* */
import java.io.UnsupportedEncodingException;
public class Bolg1 {
public static void main(String[] args) throws UnsupportedEncodingException {
String str = new String ("dang党学义");
byte [] by = new byte[1024];
by = str.getBytes("gbk");
for(int a = 0 ;a<by.length;a++){
System.out.print(by[a]);
}
// utf_8 10097110103-27-123-102-27-83-90-28-71-119 每个汉字占3个字节
//unicode -2-10100097011001038190911027873
//gb2312 10097110103-75-77-47-89-46-27
//gbk 10097110103-75-77-47-89-46-27 每个汉字占2个字节
}}/*Web开发中经常会遇到乱码问题,对于初学者来说乱码问题非常恼人。以Java语言为例,如果我们通过Java抓取一个网页的文本,打印之后发现是乱码,我们能否通过String newStr = new String(oldStr.getBytes("oldcharset"), "newcharset")的方式得到正确的字符串?Java 的String类使用的是Unicode编码方式,对于String类而言,我们可以认为Unicode是所有字符的终极表示形式,无论在创建字符串(比如String(byte[] bytes, Charset charset))的时候指定的是何种编码,Java语言都会将其转换为Unicode编码。盲目的指定charset会导致三种情况:一、指定的编码是正确的,bytes数组中的码点能够准确无误的转换成原来的字符串。二、指定的编码是错误的,但是bytes数组中的码点对于该charset都是有效的,即没有落到无效区域。那么我们也能够得到一个字符串,只不过字符跟原来不同了。这时我们可以通过String newStr = new String(oldStr.getBytes("oldcharset"), "newcharset")的方式还原出原来的字符。这在web开发中会经常的用到的;三、指定的编码是错误的,并且bytes数组中存在一些码点对于该charset是无效的,即这些码点对于该charset没有任何含义。对于无效的码点,会转换成Unicode的REPLACEMENT CHARACTER(Unicode码点0xFFFD)。这时我们是不能通过String newStr = new String(oldStr.getBytes("oldcharset"), "newcharset")的当时还原原来的字符的。 * * * * * * */