作家
登录

一筹莫展?来看看字符编码的前世今生吧

作者: 来源: 2017-11-02 15:16:43 阅读 我要评论

束手无策?来看看字符编码的前世此生吧

大年夜端与小端

大年夜小端是数据在存储器中的存放次序,大年夜端模式,是指数据的高字节在前,保存在内存的低地址中,与仁攀类的读写法一致,数据的低字节在后,保存在内存的高地址中,小端与之相反,小端模式,是指数据的高字节在后,保存在内存的高地址中,而数据的低字节在前,保存在内存的低地址中例如,十六进制数值 0x1234567 的大年夜端字节序和小端字节序的写法:

束手无策?来看看字符编码的前世此生吧

至于为什么会有大年夜端和小端之分呢?对于 16 位或者 32 位的处理器,因为存放器宽度大年夜于一个字节,那么必定存在着一个若何将多个字节排放的问题,因为不合操作体系攫取多字节的次序不一样,,x86和一般的OS(如windows,FreeBSD,Linux)应用的是小端模式。但比如Mac OS是大年夜端模式。是以就导致了大年夜端存储模式和小端存储模式的存在,两者并没有孰优孰劣。

UTF( Unicode Transformation Format)编码 和 USC(Universal Coded Character Set) 编码分别是 Unicode 、ISO/IEC 10646 编码体系琅绫擎两种编码方法,UCS 分为 UCS-2 和 UCS-4,而 UTF 常见的种类有 UTF-8、UTF-16、UTF-32。因为 Unicode 与 USC 两种字符集是互相兼容的,所以这几种编码格局也有着对应的等值关系

UTF-8 的编码单位是1个字节,所以就不消推敲字节序问题。而 UTF-16 是用 2个字节来编码 Unicode 字符,编码单位是两个字节,是以须要推敲字节序问题,因为2个字节哪个存高位哪个存低位须要肯定。

如今总算把理论说完了,再来说说 Python 中的编码问题,也是每个Python开辟者最关怀、最经常碰到的问题,Python 的出生时光比 Unicode 还要早几年,所以,Python的第一个版本一向延续到Python2.7,Python 的默认编码都是 ASCII

  1. >>> import sys 
  2. >>> sys.getdefaultencoding() 
  3. 'ascii' 

所以在 Python 源代码,要可以或许正常保存中文字符就必须先指定utf

8 或者 gbk 格局

  1. # coding=utf-8 

或者是:

引用

  • UnicodeEncodeError: 'ascii' codec can't encode characters in position 6-7: ordinal not in range(128)

在前面我们介绍过字符,这里还有须要反复一下字符和字节的差别,字符就是一个符号,比如一个汉字、一个字母、一个数字、一个标点都可以称为一个字符,而字节就是字符就是编码之后转换而成的二进制序列,一个字节是8个比特位。例如字符 "p" 存储到硬盘是一串二进制数据 01110000,占用一个字节。字节便利存储和收集传输,而字符用于显示便利浏览。

在Python2中,字符与字节的表示很奥妙,两者的界线很模糊,Python2 中把字符串分为 unicode 和 str 两种类型。本质上 str 类型是二进制字节序列, unicode 类型的字符串是字符,下面的示例代码可以看出 str 类型的 "禅" 打印出来是十六进制的 \xec\xf8 ,对应的二进制字节序列就是 '11101100 11111000'。

  1. >>> s = '禅' 
  2. >>> s 
  3. '\xec\xf8' 
  4. >>> type(s) 
  5. <type 'str'

而 unicode 类型的 u"禅" 对应的 unicode 符号是 u'\u7985'

我们要把 unicode 字符保存到文件或者传输到收集就须要经由编码处理转换成二进制情势的 str 类型,于是 python 的字符串供给了 encode 办法,大年夜 unicode 转换到 str,反之亦然。

  1. >>> u = u"禅" 
  2. >>> u 
  3. u'\u7985' 
  4. >>> type(u) 
  5. <type 'unicode'

为什么会出现 UnicodeEncodeError?

总结

  • 字符编码本质上是字符到字节的转换过程
  • 字符集的演进过程是:ascii、eascii、ios8895-x,gb2312... Unicode
  • Unicode是字符集,对应的编码格局有UTF-8,UTF-16
  • 字节序列存储的时刻有大年夜小端之分
  • python2中字符与字节分别用unicode和str类型表示
  • python3中字符与字节分别用str与bytes表示
  1. >>> u = u

      推荐阅读

      总是记不住密码怎么办?可以把它存在衬衫上

    捷报道,美国华盛顿大年夜学的研究人员正在研究所谓的“智能织物”,他们的重点放在磁化纺织品上。这种纺织品可以存储能被磁力仪攫取的少量数据,包含存储在大年夜多半智妙手机内部的数据。这>>>详细阅读


    本文标题:一筹莫展?来看看字符编码的前世今生吧

    地址:http://www.17bianji.com/lsqh/38408.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)