python3 unicod,utf-8,gbk的编码和解码中文显示问题

ITxiaobaibai 2020-03-23

python3的字符编码让人头疼。
这个也不是一篇介绍gbk, utf-8, unicode怎么表示英文,中文字符的基础知识总结。
网上有很多类似的文章,目前也不需要升入学习到了解各个bit位表示什么含义。

目的:
清楚了解为什么在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中显示的过程。
分析:

  1. python3代码文件用utf-8编码中文字符 ”中“ 为 b‘\xe4\xb8\xad‘
  2. python3解释器用代码申明GBK读取 b‘\xe4\xb8\xad‘, 得到 乱码字符串(unicode形式,字符串在内存中为unicode编码), 假如为字符%。
  3. python3代码用GBK编码 将字符%对于的GBK编码b‘\xe4\xb8\xad‘写入文件f2
  4. linux终端用uft-8打开 b‘\xe4\xb8\xad‘,能正常显示

例子2:
python3 一个中文字符串(str=‘中‘)utf-8编码,代码申明解码为GBK,代码中用uft-8写到(文件系统write方法)另外一个文件f2,在linux中显示的过程。
分析:

  1. python3代码文件用utf-8编码中文字符 ”中“ 为 b‘\xe4\xb8\xad‘
  2. python3解释器用代码申明GBK读取 b‘\xe4\xb8\xad‘, 得到 乱码字符串(unicode形式,字符串在内存中为unicode编码), 假如为字符%。
  3. python3代码用uft-8编码,将字符%对应的utf-8编码(肯定不是 b‘\xe4\xb8\xad‘的二进制数值了),写入文件f2
  4. linux终端用uft-8打开一个不是b‘\xe4\xb8\xad‘的编码,不能正常显示。

参考文章:

  1. https://www.cnblogs.com/yuanchenqi/articles/5956943.html

  2. https://mp.weixin.qq.com/s/JxD7LC33zbFD5QBxJ6jMWw

  3. https://blog.csdn.net/qq_33692803/article/details/81321340?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

相关推荐