编码

来源:互联网 发布:全球贸易预警数据库 编辑:程序博客网 时间:2024/06/10 11:34

1  简单概念

         编码:信息从一种形式或格式转换为另一种形式或格式的过程。就是将我们看到的文字,图片等信息按照某种规则存储在计算机中。

         解码:编码的逆过程,将存储在计算机上的二进制转换为我们看到的文子,图片。

          字符:一个字符是一个单位的字形、类字形单位或符号的基本信息。字符是指计算机中使用的字母、数字、字和符号。

          字符集:多个字符的集合,常见字符集有,ASCII,Unicode

          是把字符集中的字符编码为指定集合中某一对象(例如:比特模式、自然数序列、8位组或者电脉冲),以便文本在计算机中存储和通过通信网络的传递

          Unicode又称为统一码、万国码、单一码,它是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

           一个字符的Unicode编码是确定的,但是在实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,对Unicode编码的实现方式有所不同。Unicode的实现方式称为Unicode转换格式(Unicode Transformation Format,简称为UTF),有UTF-8、UTF-16、UTF-32三种实现方式

            UCS(Universal Character Set,通用字符集),是由ISO制定的ISO 10646(或称ISO/IEC 10646)标准所定义的标准字符集。UCS不仅给每个字符分配一个代码,而且赋予了一个正式的名字。表示一个UCS或Unicode值的十六进制数通常在前面加上“U+”,例如“U+0041”代表字符“A”

       

          大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。
          小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低

         Unicode规范中定义,每一个文件的最前面分别加入一个表示编码顺序的字符,这个字符的名字叫做”零宽度非换行空格”(ZERO WIDTH NO-BREAK SPACE),用FEFF表示。这正好是两个字节,而且FF比FE大1。

         如果一个文本文件的头两个字节是FE FF,就表示该文件采用大头方式;如果头两个字节是FF FE,就表示该文件采用小头方式

        

           UTF-8使用一到四个字节为每个字符编码,编码规则如下:

            1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。

            2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

            

Unicode

UTF-8

0000 ~007F

0XXX XXXX

0080 ~07FF

110X XXXX 10XX XXXX

0800 ~FFFF

1110XXXX 10XX XXXX 10XX XXXX

1 0000 ~1F FFFF

1111 0XXX 10XX XXXX 10XX XXXX10XX XXXX

20 0000 ~3FF FFFF

1111 10XX 10XX XXXX 10XX XXXX10XX XXXX 10XX XXXX

400 0000 ~7FFF FFFF

1111 110X 10XX XXXX 10XX XXXX10XX XXXX 10XX XXXX 10XX XXXX

           已知”严”的unicode是4E25(100111000100101),根据上表,可以发现4E25处在第三行的范围内(0000 0800-0000 FFFF),因此”严”的UTF-8编码需要三个字节,即格式是”1110xxxx 10xxxxxx 10xxxxxx”。然后,从”严”的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。这样就得到了,”严”的UTF-8编码是”11100100 10111000 10100101″,转换成十六进制就是E4B8A5。

        Javaweb解决乱码问题

         Get方式

        Serlvet:

url地址后的参数服务器默认用ISO-8859-1进行编码

结论:乱码

解决办法:request.setCharacterEncoding("UTF-8");结果:无效

String name = reuqest.getParameter("name");

拿到原始的二进制数据,用UTF-8进行重新编码

byte b[] = name.getBytes("ISO-8859-1");//1010101

String name = new String(b,"UTF-8");//解决

 

<Connector URIEncoding="UTF-8" useBodyEncodingForURI="true"/>

Serlvet:

由于客户端没有告诉服务器,请求正文的编码,于是服务器默认用ISO-8859-1进行编码

结论:乱码

 

解决办法:告诉服务器请求正文的数据应该使用的编码是什么?UTF-8

request.setCharacterEncoding("UTF-8");


       

           
原创粉丝点击