一、字符与字节
字符是人类能够识别的字体符号,而这些符号要保存到计算机的存储中,就需要用计算机能够识别的字节来表示。
字符编码的作用:将人类可识别的字符转换为机器可识别的字节码,
解码:将机器可识别的字节码转换成人类可识别的字符。
Unicode只是一个符号集,它只规定了人类现实生活所有字体符号的二进制代码,也就是说它给每一个字符一个独一无二的数字来表示。Unicode才是真正的字符串,
而用ASCII、UTF-8、GBK等字符编码表示的是字节串。从上面对各种编码方式的介绍中,我们也可以了解到,像ASCII、UTF-8、GBK这些都是编码方式,是将字符编码为字节码。
二、编码与解码
1.定义
编码是给计算机底层用的,也是机器唯一能看懂的(将Unicode字符串转换为特定字符编码(ASCII、UTF-8、GBK)对应的字节串的过程和规则就是编码。)。
解码是显示给人看的,凡是人眼能识别的字符都是要解码过的(将特定字符编码(ASCII、UTF-8、GBK)的字节串转换为对应的Unicode字符串的过程和规则就是解码。)
2. Python源代码文件的执行过程
磁盘上的文件都是以二进制格式存放的,其中文本文件都是以某种特定编码后的字节形式存放的。
比如我们使用Pycharm来编写Python程序时会指定工程编码和文件编码为UTF-8(#--coding:utf-8-- ),那么Python代码被保存到磁盘时就会被转换为UTF-8编码对应的字节(encode过程)后写入磁盘。
当执行Python代码文件中的代码时,Python解释器在读取Python代码文件中已经被编码的字节串之后,我们会在**控制台窗口看看程序到底输出了什么,**这时候其实就是将字节码转换为Unicode字符串(decode过程)之后才能被我们看到结果。
3. 默认编码
Python3的解释器以"UTF-8"作为默认编码,(在Linux上操作系统是UTF-8)。但是我们在Windows上进行开发时,Python工程及代码文件都使用的是默认的GBK编码(因为win系统上默认是GBK,但是如果在python代码开头指定用utf-8却可以用utf-8编解码),
也就是说Python代码文件默认是被转换成GBK格式的字节码保存到磁盘中的。Python3的解释器执行该代码文件时,试图用UTF-8进行解码操作时,同样会解码失败,出现如下错误:因为不同编码,有不同的编码规则,结果在一些码表里面可能不存在该字节串,尽管gbk能够包含中文。我们一旦编码和解码用的不一致就会乱码。
【老鸟建议】一般项目都会使用 UTF-8。unicode 中虽然汉字是两个字节,UTF-8 中汉字是 3 个字节。但是互联网中一个网页也包含了大量的英文字母,这些英文字母只占用 1 个字节,整体占用空间,UTF-8 仍然由于 Unicode。
2.中文乱码问题
windows 操作系统默认的编码是 GBK,Linux 操作系统默认的编码是 UTF-8。当我们
用 open()时,调用的是操作系统打开的文件,默认的编码是 GB
f=open("1.txt","w")
s="尚学堂\n 百战程序员\n"
f.write(s)
f.close()
########输出结果:
直接在pycharm中打开乱码,因为pycharm解码是用的是UTF-8而非GBK,所以需要将本文件的encoding方式转化成GBK,方可解决f=open("1.txt","w",encoding="utf-8")
s="尚学堂\n 百战程序员\n"
f.write(s)
f.close()
########输出结果:
尚学堂
百战程序员
















