目的:
清楚了解为什么在python3不同的编码,解码,windows,linux操作系统下,字符是否能够正确显示。
前提:
了解不同编码用不同的二级制编码和长度来表示字符。
在python3中,各种字符编码之间的互相转换都要通过unicode作为中间编码转换。gbk转换成unicode,再从unicode转换成utf-8。
分析:
要区分4种编码解码概念,
1.编写代码文件时的编码。
notepad++ 在菜单“编码”中有选择,在状态栏可以看到编码类型。
pycharm 在菜单"file","editor","file encoding"中可以设置默认编码。在状态栏可以看到编码类型。
2.python3代码中申明的解码格式。
在代码中#coding=gbk。
编码声明告诉了python编译器以什么格式的编码来解码.py文件,它不会改变系统默认编码和本地默认编码,
也不是用于声明当前代码文件的编码格式的,而是声明当前代码文件的解码方式。换句话说,
代码文件的编码格式取决于你使用的编辑器,而如何解码该文件取决于文件头处的编码声明。
一般地,编码格式应当与解码格式一致,即编辑器的编码格式与编码声明应当一致。
注:根据代码中申明的解码类型,pycharm会自动改变编码类型,让编码类型和解码类型保持一致。这是pycharm的优点。
3.python解释器的默认编码格式。
当python的编译器读取.py文件时,若无编码声明,则使用系统默认编码来解码.py文件。
用 import sys, sys.getdefaultencoding() 查看
4.本地默认编码
本地指的才是操作系统,因此本地默认编码即操作系统的默认编码。
显然,python编译器的默认编码在不同的操作系统中保持一致,操作系统的默认编码随操作系统的不同而发生了改变。
用import locale, locale.getdefaultlocale()查看。 windows是gbk, linux是utf-8。
例子1:
python3 一个中文字符串(str=‘中‘)utf-8编码,代码申明解码为GBK,代码中用gbk写到(文件系统write方法)另外一个文件f2,在linux中显示的过程。
分析:
python3代码文件用utf-8编码中文字符 ”中“ 为 b‘\xe4\xb8\xad‘
python3解释器用代码申明GBK读取 b‘\xe4\xb8\xad‘, 得到 乱码字符串(unicode形式,字符串在内存中为unicode编码), 假如为字符%。
python3代码用GBK编码 将字符%对于的GBK编码b‘\xe4\xb8\xad‘写入文件f2
linux终端用uft-8打开 b‘\xe4\xb8\xad‘,能正常显示
例子2:
python3 一个中文字符串(str=‘中‘)utf-8编码,代码申明解码为GBK,代码中用uft-8写到(文件系统write方法)另外一个文件f2,在linux中显示的过程。
分析:
python3代码文件用utf-8编码中文字符 ”中“ 为 b‘\xe4\xb8\xad‘
python3解释器用代码申明GBK读取 b‘\xe4\xb8\xad‘, 得到 乱码字符串(unicode形式,字符串在内存中为unicode编码), 假如为字符%。
python3代码用uft-8编码,将字符%对应的utf-8编码(肯定不是 b‘\xe4\xb8\xad‘的二进制数值了),写入文件f2
linux终端用uft-8打开一个不是b‘\xe4\xb8\xad‘的编码,不能正常显示。
参考文章: