字符集,编码,以及其他一切我们时时碰到,但却可以回避的问题,终有一天我们需要把它们彻底解决。
今天花了很长时间查阅了许多资料来了解这一切,下面谈谈我的理解和感受,各位看官也发表一下自己的见解吧!
关键字
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吧。
Javascript中的编码
Python中的编码
理解层次
相关应用
对照上文描述的unicode和utf-8在编码空间上关联的表格,你就能明白下面代码的原理:
疑问
参考资料
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
今天花了很长时间查阅了许多资料来了解这一切,下面谈谈我的理解和感受,各位看官也发表一下自己的见解吧!
关键字
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 輔助平面的字元使用四位元組編碼。
Javascript中的编码
- escape
- encodeURI
- encodeURIComponent
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