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

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

原文地址:https://blog.51cto.com/jsahz/2480981

时间: 2024-08-30 12:51:11

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

GBK,UTF-8,和ISO8859-1之间的编码与解码

Unicode.UTF-8 和 ISO8859-1到底有什么区别 将以"中文"两个字为例,经查表可以知道其GB2312编码是"d6d0 cec4",Unicode编码为"4e2d 6587",UTF编码就是"e4b8ad e69687".注意,这两个字没有iso8859-1编码,但可以用iso8859-1编码来"表示". 2. 编码基本知识 最早的编码是iso8859-1,和ascii编码相似.但为了方便表

python3中的编码与解码原理

先看代码 >>> a = '中文' >>> a '中文' >>> print(a) 中文 >>> b = 'English' >>> b 'English' >>> print(b) English 解释编码和解码的过程 >>> aa = a.encode('utf-8') >>> aa b'\xe4\xb8\xad\xe6\x96\x87' >>&g

python3中编码和解码

------------恢复内容开始------------ 一.python3与python2.7在字符编码上的差异 python2.7 默认编码是和所在的操作系统一致,windows 是 GBK,macOS是 utf8 ,linux是utf8 python3 编码统一规定默认编码为 Unicode 二.python3中str和bytes的区别 (1)python3有两种数据类型:str 和bytes. 1.编码为Unicode的文本显示为str: 2.其他编码(比如gbk,utf8等)显示为

python编码:gbk编码与解码

gbk编码与解码: >>> a='\xce\xc4\xbc\xfe\xb5\xbd\xb4\xef\xb3\xc9\xb9\xa6' #gbk编码后的数据 >>> a '\xce\xc4\xbc\xfe\xb5\xbd\xb4\xef\xb3\xc9\xb9\xa6' >>> b=a.decode('gbk') #gbk解码 >>> b u'\u6587\u4ef6\u5230\u8fbe\u6210\u529f' >>&

多线程批量转换文件编码, 从GBK, GB2312编码转换到UTF-8编码(Python)

# coding=utf-8 # author:Jeffrey Ma # version:0.1 # build 2 # created on:2015年3月31日 # description: 1. 批量转换文件编码,从GBK GB2312编码转换到UTF-8编码 # 2. 支持指定目录下所有的文件的转换,包括子目录中的文件 # 3. 支持检测原始编码,对已经是UTF-8编码的文件,不做转换 # 4. 支持只转换指定扩展名的编码 # 5. 支持多线程转换和控制台输出 # 6. 支持控制台显示线

Python3的unicode编码转换成中文问题

Python3的unicode编码转换成中文问题 从别的地方搬过来的,担心以后不容易搜索到,就收集过来. 我当时面临的问题是要从C++发json代码出来,用python写了个server,然后返回给C++程序,结果收到的是:httpSvrDataCbUser: {"tranNO": "0808ad498670dc996", "data": "\u65b0A1EY16", "ver": "1.0&q

Python学习笔记八:文件操作(续),文件编码与解码,函数,递归,函数式编程介绍,高阶函数

文件操作(续) 获得文件句柄位置,f.tell(),从0开始,按字符数计数 f.read(5),读取5个字符 返回文件句柄到某位置,f.seek(0) 文件在编辑过程中改变编码,f.detech() 获取文件编码,f.encoding() 获取文件在内存中的编号,f.fileno() 获取文件终端类型(tty.打印机等),f.isatty() 获取文件名,f.name() 判断文件句柄是否可移动(tty等不可移动),f.seekable() 判断文件是否可读,f.readable() 判断文件是

从Python的角度来看编码与解码

导语: Python2和Python3中,因为默认字符集的不同而造成的麻烦,简直是程序员的梦魇!要彻底告别这个麻烦,就需要从本质上来理解编码和解码. 为什么要有编码? 对于不会英文的中国人来说,将英文翻译成中文,这个就叫做解码:而将中文翻译成英文,自然就是编码了! 这个道理在计算机中同样适用. 计算机只能识别0和1,任何文字对于计算机来说,就是0和1的排列组合.但是我们人类哪看得懂这种0和1的排列组合! 自然就需要将0和1的文字转换为我们能看得懂的文字,比如中文,英文等. 而这种0和1到文字的映

理清文件编码,告别中文乱码

理清文件编码,告别中文乱码 在工作中少不了碰到文件乱码的问题,面对这么多的中文汉字编码,真不知该选哪个好,不如彻底搞清楚,让乱码灰飞烟灭:以下介绍文本编码中常用到的几种:iso8859-1.GDK/GB2312.ANSI.unicode 以及UTF : iso8859-1 iso8859-1 通常叫做Latin-1,属于单字节编码,最多能表示的字符范围是0-255,应用于英文系列.比如,字母a的编码为0x61=97. 很明显,iso8859-1编码表示的字符范围很窄,无法表示中文字符.但是,由于