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

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

目的:
清楚了解为何在python3不一样的编码,解码,windows,linux操做系统下,字符是否可以正确显示。python

前提:
了解不一样编码用不一样的二级制编码和长度来表示字符。
在python3中,各类字符编码之间的互相转换都要经过unicode做为中间编码转换。gbk转换成unicode,再从unicode转换成utf-8。linux

分析:
要区分4种编码解码概念,windows

1.编写代码文件时的编码。
notepad++ 在菜单“编码”中有选择,在状态栏能够看到编码类型。
pycharm 在菜单"file","editor","file encoding"中能够设置默认编码。在状态栏能够看到编码类型。编辑器

2.python3代码中申明的解码格式。
在代码中#coding=gbk。
编码声明告诉了python编译器以什么格式的编码来解码.py文件,它不会改变系统默认编码和本地默认编码,
也不是用于声明当前代码文件的编码格式的,而是声明当前代码文件的解码方式。换句话说,
代码文件的编码格式取决于你使用的编辑器,而如何解码该文件取决于文件头处的编码声明。
通常地,编码格式应当与解码格式一致,即编辑器的编码格式与编码声明应当一致。ide

注:根据代码中申明的解码类型,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中显示的过程。
分析:.net

  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
相关文章
相关标签/搜索