常用字符编码转换

不论是web开发或是移动开发,在不同场景总是需要用的编码的转换,之前一直没有去深入的研究其中的转换关系,今天抽空学习了下(字符编码介绍很多,我只是将之间的关系总结了下,具体介绍可自行wiki)。 先介绍下几种主要的编码方式ASCII、Unicode、UTF-8、GBK、BASE64、URLEncode。

  • ASCII:美国信息交换标准代码,是基于拉丁字母的一套电脑编码系统,只能显示26个基本拉丁字母、阿拉伯数目字和英式标点符号,现在的软件系统大多采用Unicode。7位字符集,支持128个字符。
  • Unicode:固定长度2字节,16位字符集,最多支持2^16个字符。因为ASCII码只有7位,Unicode表示ASCII码,会用0补齐,会造成浪费所以又再次基础上扩展出了UTF-8等变长编码方案。
  • UTF-8:是一种针对Unicode的可变长度字符编码,也是一种前缀码。通过1-6个字节表示不同编码,非固定长度,通过编码前缀来区分不同编码。
  • GBK:汉字内码扩展规范
  • BASE64:ASCII、Unicode、UTF-8编码其实建立的是字符与字符编码的对应关系(即字符->字符编码),BASE64、URLEncode是建立在这些字符集上用于在一些特殊场景中的编码转换方案(字符编码->字符)。BASE64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2的6次方等于64,所以每6个位元为一个单元,对应某个可打印字符。三个字节有24个位元,对应于4个Base64单元,即3个字节需要用4个可打印字符来表示。3byte的原始字符编码数据需要使用4个打印字符表示,64个打印字符包括大小写26个英文字母10个数字“+”、“/“、”=”,因此经过base64编码后的数据长度约为原长度的4/3。
  • URLEncode:URL编码,是特定上下文的统一资源定位符 (URI)的编码机制,URI所允许的字符分作保留与未保留,保留字符具有特殊含义( 例如:斜线字符用于URL (或者更一般的, URI)不同部分的分界),未保留字符没有这些特殊含义,URI中的其它字符必须用百分号编码。 如果一个保留字符在特定上下文中具有特殊含义(称作”reserved purpose”) , 且URI中必须使用该字符用于其它目的, 那么该字符必须百分号编码. 百分号编码一个保留字符,首先需要把该字符的ASCII的值表示为两个16进制的数字,然后在其前面放置转义字符(“%”),置入URI中的相应位置。(对于非ASCII字符, 需要转换为UTF-8字节序, 然后每个字节按照上述方式表示.)

给个简单的例子,看看编码间的转换: “我”对应的uncode码(java和net中string存储字符使用的就是unicode,string toCharArray之后的字符的值即为unicode码值):0110 0010 0001 0001 ,u6211 utf-8表示2个字节使用的标量值1110xxxx(E0-EF) 10yyyyyy 10zzzzzz(6z+6y+4x=2*8),unicode的2进制码转换utf-8:1110 0110  100010 00 1001 0001,16进制码为0xE6 0x88 0x91
对上面的UTF-8编码结果进行Base64编码过程,拆分1110 0110  100010 00 1001 0001为111001、101000、100010、01000对应十进制数值57、40、34、17,码表中的字符5oiR,即对应的BASE64字符串。