美文网首页
字符编码

字符编码

作者: 慕知 | 来源:发表于2021-08-06 13:04 被阅读0次

    pycharm运行三大流程

    python test.py为例,执行流程如下:
    1,启动运行pycharm
    2,把要读取的文件,从将数据从硬盘读取到内存
    3,取出指令执行,识别python语法,内容展示
    
    PS:pycharm与其他编辑器的区别在于会识别语法,有些编辑器直接显示或者编辑内容
    
    
    1,字符编码
    即人类的语言(比如python,java等语言)转换为机器理解的语言(二进制010101)
    需要参考一个特定的标准,比如生活中的hello对应的是你好,而我们使用的计算机的标准就是字符编码表,该表上存放的就是字符与数字一一对应的关系。
    
    

    字符编码发展史

    发展史阶段一:
    美国(计算机起源),诞生ASCII表
    # ASCII表的特点:
        1、只有英文字符与数字的一一对应关系
        2、一个英文字符对应1Bytes,1Bytes=8bit,8bit最多包含256个数字,可以对应256个字符,足够表示所有英文字符
    
    
    
    发展史阶段二:
    为了计算机能够识别中文,中国人定制了GBK表
    # GBK表的特点:
        1、只有中文字符、英文字符与数字的一一对应关系
        2、一个英文字符对应1Bytes
           一个中文字符对应2Bytes
           补充说明:
           1Bytes=8bit,8bit最多包含256个数字,可以对应256个字符,足够表示所有英文字符
           2Bytes=16bit,16bit最多包含65536个数字,可以对应65536个字符,足够表示所有中文字符
    此外,每个国家都有自己的编码表。。。
    
    
    加图
    
    
    
    
    发展史阶段三:
    万国字符unicode
    为解决第二阶段各个国家不相通的问题,出现unicode
    
    # 英文字符可以被ASCII识别
    英文字符--->unciode格式的数字--->ASCII格式的数字
    
    # 中文字符、英文字符可以被GBK识别
    中文字符、英文字符--->unicode格式的数字--->gbk格式的数字
    
    # 日文字符、英文字符可以被shift-JIS识别
    日文字符、英文字符--->unicode格式的数字--->shift-JIS格式的数字
    
    PS:
    这样一来,任意字符(中文/英语/日语)走内存unicode都会解析对应的格式(ASCII / gbk等),在写进硬盘(可选择任意格式写入,注意的是,写进硬盘什么格式,读取也要用该格式)
    
    
    
    
    由字符转换成内存中的unicode,以及由unicode转换成其他编码的过程,都称为编码encode
    由内存中的unicode转换成字符,以及由其他编码转换成unicode的过程,都称为解码decode
    
    PS:
    在诸多文件类型中,只有文本文件的内存是由字符组成的,因而文本文件的存取也涉及到字符编码的问题
    
    
    编码encode 解码decode

    utf8

    utf8由来:
    如果多国字符包含大量英文字符存储时,使用unicode格式存放会额外占用一倍空间(英文字符其实只需要用一个字节存放即可)
    空间占用并不是最致命的问题,最致命地是当我们由内存写入硬盘时会额外耗费一倍的时间,造成io问题
    
    #多国字符—√—》内存(unicode格式的二进制)——X—》硬盘(GBK格式的二进制)
    
    #多国字符—√—》内存(unicode格式的二进制)——X—》硬盘(Shift_JIS格式的二进制)
    
    演变为
    
    # 多国字符—√—》内存(unicode格式的二进制)——√—》硬盘(utf-8格式的二进制)
    unicode像是一个过度版本,我们新开发的软件或文件存入硬盘都采用utf-8格式,最后会慢慢淘汰掉unicode
    
    
    

    encode & decode

    x='上'
    res=x.encode('utf-8')
    print(res,type(res))
    # b'\xe4\xb8\x8a' <class 'bytes'>
    
    print(res.decode('utf-8'))
    # 上
    
    
    

    参考https://zhuanlan.zhihu.com/p/108805502

    b.python内容如下,以GBK格式存储
    x='早'
    print(x)
    
    
    
    # python2执行
    ng@mzdeMacBook-Pro Desktop % python2 b.py
      File "b.py", line 1
    SyntaxError: Non-ASCII character '\xe6' in file b.py on line 1, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
    
    # python3执行
    g@mzdeMacBook-Pro Desktop % python3 b.py
    早
    
    
    
    
    例1
    utf-8写入,python2执行会失败,默认读取ASCII(英文字符)
    print('您好')
    # ng@mzdeMacBook-Pro Desktop % python2 /Users/shiheng/PycharmProjects/pythonProject/Test/a.py
    #   File "/Users/shiheng/PycharmProjects/pythonProject/Test/a.py", line 1
    # SyntaxError: Non-ASCII character '\xe5' in file /Users/shiheng/PycharmProjects/pythonProject/Test/a.py on line 1, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
    
    
    
    python3执行 (默认即utf-8)
    # ng@mzdeMacBook-Pro Desktop % python3 /Users/shiheng/PycharmProjects/pythonProject/Test/a.py
    # 您好
    
    
    例2
    pycharm只是一个编辑器,写入一个“中文字符” 即gbk格式,
    该文件在python2执行会报错,python2默认acsii格式(只能读取英文);
    python3执行也会报错,phthon3默认是utf8格式(但写入的是gbk)所以也会报错
    print('你好')  ===> gbk存入
    
    
    # python2执行,报错
    #ng@mzdeMacBook-Pro Desktop % python2 /Users/shiheng/PycharmProjects/pythonProject/Test/c.py
      File "/Users/PycharmProjects/pythonProject/Test/c.py", line 1
    SyntaxError: Non-ASCII character '\xc4' in file /Users/shiheng/PycharmProjects/pythonProject/Test/c.py on line 1, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
    
    
    # python3执行,报错
    #ng@mzdeMacBook-Pro Desktop % python3 /Users/PycharmProjects/pythonProject/Test/c.py
      File "/Users/PycharmProjects/pythonProject/Test/c.py", line 1
    SyntaxError: Non-UTF-8 code starting with '\xc4' in file /Users/PycharmProjects/pythonProject/Test/c.py on line 1, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
    
    总结:写入gbk方式,读取也需要gbk,不然就会报错;
    以上python2 默认ASCIIl; python3默认utf-8 所以都会报错
    
    
    例3
    coding:gbk(是小写) 不能是大写;
    作用:在首行自定义读取的格式;
    ps:如果在pycharm编辑器里写入该首行,编辑器会自动把存储的格式也变成自定义的格式(pycharm默认存储到硬盘是utf8格式)
    
    #coding:gbk
    x='您好'
    print(x)
    
    # python2 乱码,因为python2不清楚x赋予的变量是什么类型
    ng@mzdeMacBook-Pro Desktop % python2 /Users/PycharmProjects/pythonProject/Test/d.py
    ���
    
    
    # python3 不乱码是因为python3默认读写都是utf-8
    ng@mzdeMacBook-Pro Desktop % python3 /Users/PycharmProjects/pythonProject/Test/d.py
    您好
    
    
    定义字符串变量前面加上u
    #coding:gbk
    x=u'您好'
    print(x)
    
    # python2
    ng@mzdeMacBook-Pro Desktop % python2 /Users/PycharmProjects/pythonProject/Test/d.py
    您好
    
    
    # python3
    ng@mzdeMacBook-Pro Desktop % python3 /Users/PycharmProjects/pythonProject/Test/d.py
    您好
    
    
    

    总结

    python3默认读取utf8;
    
    
    在文件首行写入包含#号,
    解释器会先用默认的编码方式读取文件的首行内容,由于首行是纯英文组成,而任何编码方式都可以识别英文字符。
    #encoding:GBK
    x=u'您好'
    print(x)
    
    
    
    # coding:utf-8
    x = u'上' # 即便文件头为utf-8,x的值依然存成unicode
    
    
    

    相关文章

      网友评论

          本文标题:字符编码

          本文链接:https://www.haomeiwen.com/subject/jvsevltx.html