字符集和编码

字符集,编码,以及其他一切我们时时碰到,但却可以回避的问题,终有一天我们需要把它们彻底解决。
今天花了很长时间查阅了许多资料来了解这一切,下面谈谈我的理解和感受,各位看官也发表一下自己的见解吧!

关键字
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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值