字符集和编码

来源:互联网 发布:node.js javaweb 编辑:程序博客网 时间:2024/06/05 00:54
字符集,编码,以及其他一切我们时时碰到,但却可以回避的问题,终有一天我们需要把它们彻底解决。
今天花了很长时间查阅了许多资料来了解这一切,下面谈谈我的理解和感受,各位看官也发表一下自己的见解吧!

关键字
unicode:统一码,万国码
UTF:unicode转换格式(Unicode Transformation Format)
UTF-8:unicode转换格式其中的一种
GBXXX:国标

unicode
在python程序中看到的\uXXXX以及在Javascript中出现的%uXXXX,都是unicode的编码方式。unicode使用四位十六进制数字表示绝大多数的符号,这四位十六进制数字表示的空间称为BMP(Basic Multilingual Plane 基本基本多文种平面)。关于unicode编码更详细的情况参见下图:


UTF
而Unicode的实现方式不同于编码方式。一个字符的Unicode编码是确定的。但是在实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,对Unicode编码的实现方式有所不同。Unicode的实现方式称为Unicode转换格式(Unicode Transformation Format,简称为UTF)。
其中最耳熟能详的就是UTF-8了,让我们来详细探讨一下UTF-8吧。
UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字元编码(定长码),也是一种前缀码。它可以用來表示Unicode标准中的任何字元,且其编码中的第一个位元组仍然和ASCII相容,这使得原来处理ASCII字元的软件无须或只需做少部份修改,即可继续使用。因此,它逐渐成为电子邮件、网页及其他存储或传送文字的应用中,最先采用的编码。
UTF-8使用一至四個位元组为每个字符编码:
  • 128個US-ASCII字符只需一個位元組編碼(Unicode範圍由U+0000至U+007F)。
  • 帶有附加符号的拉丁文、希臘文、西里爾字母、亞美尼亞語、希伯來文、阿拉伯文、敘利亞文及它拿字母則需要二個位元組編碼(Unicode範圍由U+0080至U+07FF)。
  • 其他基本多文種平面(BMP)中的字元(這包含了大部分常用字)使用三個位元組編碼。
  • 其他極少使用的Unicode 輔助平面的字元使用四位元組編碼。
下表格对比了unicode编码和UTF-8编码的比较:


Javascript中的编码
  • escape
  • encodeURI
  • encodeURIComponent
请参考此处:http://blog.csdn.net/cattail2012/article/details/8197174

Python中的编码
  • unicode
  • u'XXXX'
  • encode
  • decode

理解层次
  • 计算机内部存储
  • 可视字符
  • 转换方式
  • 源程序文本编码
  • 程序数据结构数据存储形式
  • 数据文件和数据库编码

相关应用
对照上文描述的unicode和utf-8在编码空间上关联的表格,你就能明白下面代码的原理:
/*** Convert unicode str into utf-8 encoding* @param {String} str Unicode string* @returns {Array} Array representation of string utf-8 encoding*/var utf8encode = function(str){  var utf8CharCodes = [];  for (var i = 0, len = str.length, c; i < len; ++i) {    c = str.charCodeAt(i);    if (c < 128) {      utf8CharCodes.push(c);    } else if (c < 2048) {      utf8CharCodes.push((c >> 6) | 192, (c & 63) | 128);    } else {      utf8CharCodes.push((c >> 12) | 224, ((c >> 6) & 63) | 128, (c & 63) | 128);    }  }  return utf8CharCodes;};

疑问
  • JS中为什么有些字符是保留的,特别是escape函数中保留的字符,为什么是这些字符,这样的保留有什么作用?

参考资料
http://en.wikipedia.org/wiki/Unicode
http://zh.wikipedia.org/wiki/Unicode
http://zh.wikipedia.org/wiki/UTF8
http://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html
原创粉丝点击