• python基础之Day7part2 史上最清晰字符编码理解


    二.字符编码

    基础知识:

    文本编辑器存取文件原理与py执行原理异同:

    存/写:进入文本编辑器 写内容 保存后 内存数据刷到硬盘

    取/读:进入文本编辑器 找到内容 从硬盘读到内存 notepad把文件内容打印到屏幕上(py启动解释器,把py当作普通文件读到内存,最后识别语法,执行)

    你往文本编辑里写汉字,内存里存的是计算机能识别的二进制,按照当时写的标准(Unicode)再反解打印出来,计算机并不识别是哪国语言

    字符编码:

    将人类的字符转换成计算机能识别的数字,这种转换必须遵循固定的标准,人类的字符和数字的对应关系。

    A-1 B-0  位数越多能表示的字符越多   当初美国人用8位( 2^8) 与英文字母对应 

    ASCII

    1个英文字符等于8个二进制位bit 等于一个Bytes 可以表示2^8的英文字符

    GBK

    1个中文字符等于16个二进制位等于两个Bytes 可以表示2^16的中文字符

    这个阶段不会出现乱码,因为各国都用自己的。

    但是软件开始跨国使用后,硬盘上还是各国软件自己编码的二进制数字(暂时不考虑硬盘),内存里需要找到兼容万国的unicode,

    与全世界的字符都建立好对应关系,用两个Bytes表示一个字符

    如果直接用unicode从内存写到硬盘,对于英文来说就浪费空间了,所以需要更精简的格式UTF-8,将数据量控制到最精简,提高计算机运行效率

    (UTF-8 是可变长的 每个语言都用适合自己的长度 更全面 用1个Bytes表示英文,3个Bytes表示中文)

    但是为什么不能内存直接存成UTF-8 ,而是多此一举存成unicode?

    unicode兼容万国  和各国语言你建立映射关系 老版本的都可以反解成unicode

    UTF-8虽然兼容万国但与各国编码无对应关系 所以内存里不能放UTF-8

    硬盘已经无法统一,各国软件已经在那里了,历史遗留问题,只要内存统一就行

    目前达成共识,往硬盘里存UTF-8,很多很多年后,历史软件退役,硬盘里就不会有乱七八糟的各国标准了

    重要结论1:

    内存中固定使用unicode编码,唯一可以改变的是存储到硬盘时使用的编码

    重要结论2:

    要想保证存取文件不乱码,应保证文件当初以什么编码存,就以什么格式取

    Unicode-编码成 gbk    gbk-解码成unicode

    重要结论3:

    py3默认读取文件按照UTF-8

    文件头:coding="gbk"  告诉py按照你指定的编码去读文件(指定的编码应该和存的编码(py右下角显示的是存的)一致)

    因为一般默认以UTF-8存,也以它取,所以通常不需要再指定,但是如果去py2运行的话就要考虑了,所以最好都指定coding="utf-8"

    print() 内存丢到操作系统 当初以UTF-8  内存unicode 现在操作系统以gbk

    py2里面字符串前面加u'跨平台更好 制造unicode  不加'u的话 就是Unicode按文件头指定格式的,否则按默认的ASCII

    py3 只能编码  因为默认的字符串类型是unicode编码  可以编码成bytes类型

    把内存的字符串写到硬盘,把内存里的unicode编码成其他可以写进硬盘里的类型,例如bytes

  • 相关阅读:
    分布式系列
    mybatis-generator自动生成代码工具
    mybatis的jdbcType和javaType、oracle,MySQL的对应类型
    spring的@Transactional注解详细用法
    Unity火爆插件Behavior Designer行为树插件学习
    Unity内存优化之视频讲解
    Unity 2018 Game Development in 24 Hours Sams Teach Yourself 3rd Edition
    8 Ball Pool
    Unity设计模式+Java设计模式,讲解+案例+PPT,一次性学会设计模式,拥抱高薪!
    Unity接入微信登录 微信分享 微信支付 支付宝SDK
  • 原文地址:https://www.cnblogs.com/chicokiko/p/9121094.html
Copyright © 2020-2023  润新知