zoukankan      html  css  js  c++  java
  • 字符编码

    前言

    想要完全理解python的字符编码,需要了解python代码运行的三个步骤。

    1. 先启动python解释器
    2. python解释器将硬盘中的文件读入内存
    3. python解释器开始翻译代码并执行(如对一个变量赋值)

    一、字符编码是什么

    因为计算机只能识别二进制,也就是一大推的010101011,而人类使用计算机都只能理解自己的语言,就像中国人只能理解汉语一样,计算机只能理解二进制一样。那么在汉语到计算机存储的二进制就会有一种转换关系,这就是字符编码产生的意义。

    一个软件运行的时候,输入的字符都是首先产生在内存中的,为了各个国家都能够统一,所以内存中都使用Unicode映射字符,当需要保存在硬盘中的时候,在按照Unicode对各个国家的编码进行一次映射转换成各个国家的编码。

    字符--》编码--》Unicode--》编码--》utf-8码
    utf-8码--》解码--》Unicode--》解码--》字符

    二、计算机编码的历史

    自美国人发明计算机起,计算机用的编码为ASCII码,一个字节占8bit,那么总共可以表示256种状态,而美国所有的字符加在一起只有120+,所以一个字节对英语来说是可以满足的。而随着计算机的发展和普及,慢慢的每个国家都需要一种编码,像中国有GBK、日本有ShiftJIS等等,这样一来,每个国家的发明的应用程序只能在自己国家内使用。为了改变这种现状,在1990年开始起草Unicode码,简称万国码,里面是一张超级大的对照表,包含了所有的编码集,比如:utf-8、gbk,shiftjis、iso-8859-1。回到python程序运行的第二步,python解释器将硬盘中的文件读入内存,因为现在计算机的内存都是Unicode,而硬盘中的文件的编码格式有很多种,所以需要将硬盘中的文件在读入内存的过程中解码为unicode,然后python在翻译执行代码。

    三、python中的编码

    在Python中有两种编码:分别为文件编码运行代码时定义字符串的编码

    • 文件编码

    在运行任何一个程序时,都是在内存中产生数据,之后再决定是否保存数据。

    假如运行pycharm来编写代码,我们输入的字符首先在内存中产生,而内存中的数据也是二进制,当编写结束需要保存的时候,需要把内存中的二进制转换成另一种二进制保存在硬盘中。而在python2和python3中分为两种情况。

    python解释器默认的编码:

    • python2:ASCII
    • python3:UTF-8

    python3编码

    为了跟上编码的改变,python3解释器默认的编码改为了UTF-8编码。而且python3中的字符都是Unicode码,当需要保存文件时,就要把Unicode码转为UTF-8码存储进硬盘。

    Unicode
    Unicode是万国码,它的产生就是为了解决编码问题。Unicode统统用两个字节保存字符,不论是英文还是中文,那么为什么保存的时候不用Unicode直接保存呢?现在的硬盘价格已经很廉价了,是为了提高程序的运行速度。磁盘IO次数越少,运行效率越高。

    UTF-8
    UTF-8是Unicode的扩展编码,用一个字节表示一个英文字符,用三个字节表示中文字符。

    三个变化

    编写代码并且保存代码在计算机中需要经过三个步骤

    编辑器中的字符--》内存中的Unicode--》硬盘中的UTF-8二进制
    utf-8仅仅是把Unicode转换成另一种二进制。

    python2编码

    python刚诞生的时候Unicode还没出生,所以python2的默认编码为ASCII,所以就会产生一些编码问题,特别是中文。因为ASCII并不能识别中文,所以在保存代码的时候,中文字符因为找不到而会在保存文件的时候损坏文件。

    python2在代码的第一行加上代码声明就可以结局这个问题

    # coding:gbk
    x = '你好啊'
    print(x)
    

    这样在保存文件和读取文件的过程中就不会出现乱码问题了。

    • 代码运行定义变量产生的编码问题

    这也分两种情况
    在Python3中默认都是Unicode码保存在内存中的,当需要取值的时候,直接把内存中的Unicode取出来就行,不存在问题。
    在Python2中定义的字符串在内存中默认用文件头声明的编码方式保存,但是当需要取值的时候,需要按照程序的编码来解码,比如在win就要按照gbk来解码,在linux就要按照utf-8来解码。

    在python3中产生的字符串会自动转成Unicode存在内存里,而在python2中就直接按照头文件声明的编码存在内存里,比如头文件声明为gbk编码,那么就用gbk码存进内存,如果是utf-8,那么就用utf-8存进内存。

    在python2中声明字符串的时候,在前面加个u,这样就会把字符串转成Unicode存进内存了。

    总结

    不论在python2还是python3中,最好都能在头文件中声明编码为utf-8,特别的,在python2中定义一个字符串变量时,在前面加个u。

  • 相关阅读:
    【转载】Nginx负载均衡之后碰到的问题
    【转载】Nginx
    【转载】大型网站架构系列之一,前言,不得不考虑的问题
    【转载】Windows上搭个Nginx集群环境玩玩
    [转载]反射
    【转载】Nginx 简介
    【转载】系统性能调优吐血总结分享
    【转载】nginx for windows: 让nginx以服务的方式运行
    poj2377
    poj2371
  • 原文地址:https://www.cnblogs.com/zuanzuan/p/9676443.html
Copyright © 2011-2022 走看看