美文网首页
字符编码

字符编码

作者: 慕知 | 来源:发表于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


相关文章

  • 部分知识点

    chr(编码值) - 将字符编码转换成字符 ord(字符) - 获取字符对应的编码值 可以将字符编码放到字符串中便...

  • 字符编码知识梳理

    [toc] 字符编码: 字符编码(英语:Character encoding)、字集码是把字符集中的字符编码为指定...

  • Python正式课第十三天

    一、文件操作与字符编码 1. 字符编码 编码 将字符转换为对应的二进制序列的过程叫做字符编码(字符->二进制01)...

  • 字符编码

    一. 什么是字符编码? 字符编码(英语:Character encoding)也称字集码,是把字符集中的字符编码为...

  • python 高级方法

    Python的字符串类型 字符编码方法 查看Python中的字符串编码名称,查看系统的编码 源文件字符集编码声明:...

  • Java内存中的文本编码

    1、编码简介 1.1 概念简析:字符、字符集、编码字符集、Code Point、Code Unit和字符编码格式 ...

  • python 字符 编码 简述

    字符编码问题很简单,当你可以区分以下几种概念之后: 字节编码与字符编码 字节串与字符串 文件编码、IDE编码、其他...

  • 13.Python之字符编码

    Python之字符编码 字符编码字符编码记录的是二进制与文字的对应关系。 常见的字符编码ASCII码:包含英文字母...

  • 笔记-encode与decode

    字节串-->decode('原来的字符编码')-->Unicode字符串-->encode('新的字符编码')--...

  • Python基础(二)-字符串和编码

    字符串和编码 字符编码 字符编码也称字集码,是把字符集中的字符编码为指定集合中某一对象,以便文本在计算机中存储和通...

网友评论

      本文标题:字符编码

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