关于编码

Posted JohnMarnoon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于编码相关的知识,希望对你有一定的参考价值。

什么是base64编码?(参考http://baike.baidu.com/link?url=cfsgKvvFm9WRUFz_gHVvRd5chcfclMd_yZLGShlkRh7LeiA4KmhoSxtOUMi7Qcb8t3FNkQNkyQT_VBOCDxLxHa)

 

采用Base64编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到。
然而,标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,而这些“%”号在存入数据库时还需要再进行转换,因为ANSI SQL中已将“%”号用作通配符。为解决此问题,可采用一种用于URL的改进Base64编码,它不仅在末尾填充\'=\'号,并将标准Base64中的“+”和“/”分别改成了“-”和“_”,这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。
什么是Unicode(参考参考http://www.cnblogs.com/chenwenbiao/archive/2011/08/11/2134503.html

 如果有一种编码,将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。这就是Unicode。

bg2007102801.jpg

 

Unicode分为 Little endian和Big endian

Unicode码可以采用UCS-2格式直接存储。

以汉字”严“为例,Unicode码是4E25,需要用两个字节存储,一个字节是4E,另一个字节是25。存储的时候,4E在前,25在后,就是Big endian方式;25在前,4E在后,就是Little endian方式。

这两个古怪的名称来自英国作家斯威夫特的《格列佛游记》。在该书中,小人国里爆发了内战,战争起因是人们争论,吃鸡蛋时究竟是从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开。为了这件事情,前后爆发了六次战争,一个皇帝送了命,另一个皇帝丢了王位。

因此,第一个字节在前,就是”大头方式“(Big endian),第二个字节在前就是”小头方式“(Little endian)。

那么很自然的,就会出现一个问题:计算机怎么知道某一个文件到底采用哪一种方式编码?

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

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

什么是ASCII码

分为两种,

基础ASCII码是使用7 位二进制数(剩下的1位二进制为0)表示128 种可能的字符(包括所有的大写和小写字母,数字0 到9、标点符号, 以及在美式英语中使用的特殊控制字符)。

扩展ASCII 码是8 位二进制数组合来表示从128 到255(0x80-0xff)的字符。

 

 

什么是utf编码(参考http://www.cnblogs.com/chenwenbiao/archive/2011/08/11/2134503.html)

对可以用ASCII表示的字符使用UNICODE并不高效,因为UNICODE比ASCII占用大一倍的空间,而对ASCII来说高字节的0对他毫无用处。为了解决这个问题,就出现了一些中间格式的字符集,他们被称为通用转换格式,即UTF(Unicode Transformation Format)。

UTF-8就是在互联网上使用最广的一种unicode的实现方式。其他实现方式还包括UTF-16和UTF-32,不过在互联网上基本不用。

UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

UTF-8的编码规则很简单,只有二条:

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

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

下表总结了编码规则,字母x表示可用编码的位。

Unicode符号范围 | UTF-8编码方式。
(十六进制) | (二进制)

0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

 

 什么是ANSI编码

是一种相对于操作系统的默认编码,对于英文文件是ASCII编码,对于简体中文文件是GB2312编码(只针对Windows简体中文版,如果是繁体中文版会采用Big5码)。

 

以上是关于关于编码的主要内容,如果未能解决你的问题,请参考以下文章

关于编码的认知

关于JS中字符串的编码

关于 UTF7 和 UTF8编码的问题

关于编码

java里关于String的编码与解码

请问一个关于URL中汉字编码解码的问题