字符集 编码
2016-05-20 18:03
288 查看
字符是人类创造出来的,代表了一定的含义的符号,这些符号在计算机中如何存储?
计算机中只有0和1,那么存储一个字符肯定需要计算机中的若干位才行,比如一个字节可以存256种字符。那么存储字符的关键性问题就设计以下的两个方面:
(1)每一个字符的数值;
(2)编码方式,即用多少位表示一个字符。
以上两个要素中,(1)可以称为字符集,就是字符到数值的映射,(2)可以成为编码方式,即如何划分bit位。
ASCII码是最常用的标准,当然这是美国人发明出来用于存储英文的标准,因此字符不多。规定用一个字节来表示128个符号。最高位全部是0,其余的7位是具体值。当然也规定了字符到数值的映射。其中关于英文字母的字符数值,基本被其余的标准所兼容,这就是英文不会乱码的原因,而标点符号之类的字符,可能与其他的标准有区别,比如和中文的标准就不一样,这就是所谓的半角和全角。
ASCII码的字符集只能有256个。那么要想存储其他语言中的字符,可能就不够,比如汉字就有几千字符。于是,各个地区就开始制定各自的标准,但是这只能在各自的地区中使用,如果跨地区就需要蛋疼的转码。最后,国际上制订了unicode标准,规定了世界上任何一个符号的数值,被称为码点(code point)。
unicode的编码是按照平面来组织的,每一个平面定规2的16次方个字符数值,目前总共有17个平面。
unicode仅仅规定了字符到数值的映射,就是(1),但是它并没有规定编码方式,也就是(2)。
常见的编码方式有utf-8,它规定了怎么划分bit位。
utf-8是一种可变长的编码方式,如果是英文字符,只需要8位来表示,如果是其他的字符,则按需分配位数。这样可以节省存储空间。具体的规则如下:
按照字节读取,
如果第一位是0,则后面的7位是该字节的unicode码,这与ASCII兼容;
如果第一位是1,则表明这不是单字节,该字符需要n(n>1)个字节表示,n就等于从第一位开始连续出现的1的个数,第n+1位是0,之后的n-1个字节的前两位都是10开头,其余的bit位为该字符的数值。用图表示更直观。
(注:该图片取自http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html)
总结:
1.存储字符涉及字符集和编码两个方面;
2.ASCII标准是英文的解决;
3.UTF-8 + unicode才是世界上全部字符的解决,二者各自解决字符集和编码两个方面。
更多内容:
http://www.ruanyifeng.com/blog/2014/12/unicode.html
http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
http://www.freebuf.com/articles/others-articles/25623.html
http://www.zhihu.com/question/23374078
计算机中只有0和1,那么存储一个字符肯定需要计算机中的若干位才行,比如一个字节可以存256种字符。那么存储字符的关键性问题就设计以下的两个方面:
(1)每一个字符的数值;
(2)编码方式,即用多少位表示一个字符。
以上两个要素中,(1)可以称为字符集,就是字符到数值的映射,(2)可以成为编码方式,即如何划分bit位。
ASCII码是最常用的标准,当然这是美国人发明出来用于存储英文的标准,因此字符不多。规定用一个字节来表示128个符号。最高位全部是0,其余的7位是具体值。当然也规定了字符到数值的映射。其中关于英文字母的字符数值,基本被其余的标准所兼容,这就是英文不会乱码的原因,而标点符号之类的字符,可能与其他的标准有区别,比如和中文的标准就不一样,这就是所谓的半角和全角。
ASCII码的字符集只能有256个。那么要想存储其他语言中的字符,可能就不够,比如汉字就有几千字符。于是,各个地区就开始制定各自的标准,但是这只能在各自的地区中使用,如果跨地区就需要蛋疼的转码。最后,国际上制订了unicode标准,规定了世界上任何一个符号的数值,被称为码点(code point)。
unicode的编码是按照平面来组织的,每一个平面定规2的16次方个字符数值,目前总共有17个平面。
unicode仅仅规定了字符到数值的映射,就是(1),但是它并没有规定编码方式,也就是(2)。
常见的编码方式有utf-8,它规定了怎么划分bit位。
utf-8是一种可变长的编码方式,如果是英文字符,只需要8位来表示,如果是其他的字符,则按需分配位数。这样可以节省存储空间。具体的规则如下:
按照字节读取,
如果第一位是0,则后面的7位是该字节的unicode码,这与ASCII兼容;
如果第一位是1,则表明这不是单字节,该字符需要n(n>1)个字节表示,n就等于从第一位开始连续出现的1的个数,第n+1位是0,之后的n-1个字节的前两位都是10开头,其余的bit位为该字符的数值。用图表示更直观。
(注:该图片取自http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html)
总结:
1.存储字符涉及字符集和编码两个方面;
2.ASCII标准是英文的解决;
3.UTF-8 + unicode才是世界上全部字符的解决,二者各自解决字符集和编码两个方面。
更多内容:
http://www.ruanyifeng.com/blog/2014/12/unicode.html
http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
http://www.freebuf.com/articles/others-articles/25623.html
http://www.zhihu.com/question/23374078
相关文章推荐
- Linux 与 Windows 对UNICODE 的处理方式
- Linux下修改MySQL编码的方法
- 字符集导致的浏览器跨站脚本攻击分析
- Unicode详细分析解释
- ASP编码必备的8条原则
- Perl ASCII 字符判断
- 基于字符集、字符编码与HTTP编码解码之万象详解
- vbs中将GB2312转Unicode的代码
- XML指南——XML编码
- C#中字符串编码处理
- 对MySQL中字符集的相关设置操作的基本教程
- ExtJS中文乱码之GBK格式编码解决方案及代码
- 将编码从GB2312转成UTF-8的方法汇总(从前台、程序、数据库)
- 程序员趣味读物 谈谈Unicode编码
- 文本文件编码方式区别
- 与ASCII码相关的C语言字符串操作函数
- C语言安全编码之数值中的sizeof操作符
- C#实现获取文本文件的编码的一个类(区分GB2312和UTF8)
- mysql 字符集的系统变量说明
- 深入理解Python字符编码 推荐