| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Python知识库 -> Python3编码问题全总结 -> 正文阅读 |
|
[Python知识库]Python3编码问题全总结 |
文章目录平常主要是写C++,但有时候也需要用到python、shell等脚本来做一些事情,其中最常见的一种应用就是文本处理,而要处理文本不可避免地就要和编码打交道,python3和python2相比在编码方面已经有了很大的进步,但有时候还是会碰到相关问题,以前没怎么特别关注过这块,都是直接用,出了什么编码问题拿报错信息一搜照着改改就完事了,但没有彻底理解很容易走弯路,最近又碰到了一次编码问题,于是最近好好整理学习了下,实际上Python3编码相关的问题也分为好多类,这里就完整地总结一下python3里面最核心的编码相关概念和问题。 一、字符串编码和解码的基本概念编码这个词搞计算机的人肯定都不陌生,这里讨论的编码特指字符串的编码解码,撇开特定计算机语言,通俗的来说字符串的编码和解码就是字符串和二进制字节串(以下用bytes代替,bytes也是python3中的一种类型)的互相转换,而我们常说的gb2312、utf-8等编码类型则是规定了不同的转换规则。 总的来说,我们所说的编码问题本质上都是各种原因造成的编码和解码所用的编码类型不一致所引起的,要保证编码解码不出问题,核心就只有一点: 在对bytes解码的过程中使用和当初它编码时使用的相同编码类型,也就是控制编码解码所用的编码类型一致。 二、Python3各编码解码场景的编码类型一致性保证只要是涉及到字符串(文本)的场景就避免不了编码解码,具体到python3这个场景里,个人认为可以分为三大类:
在具体分析各个场景之前我们先了解下一些python3编码解码相关的默认值,在很多场景如果我们不指定都会使用默认值,因此有必要了解这些默认值在我们执行脚本的环境里是什么:
下面我们就来看看这几类场景如何保证编码解码所用的编码类型一致。 2.1 字符串和bytes之间转换python3直接提供了编码解码函数用于字符串到字节码之间的互相转换,如下: 函数很好理解,这里就不多展开了,一句话总结就是指定编码类型对字符串进行编码得到bytes、对bytes进行解码得到字符串,二者均可明确指定编码类型,不太容易出错。 2.2 执行过程读取脚本这个场景的编码解码涉及到以下两点:
对于编辑器保存时候的编码不用多说,都可以设置。对于后者,默认是使用sys.getdefaultencoding()所指明的编码类型,这个编码类型在linux平台下就是utf-8,如果我们想手动指定,可以通过在脚本开头添加#coding=xxx来指定,有一点需要特别注意,这个仅仅影响解释器读取脚本过程中的解码,很多人会误以为还会影响其他地方的编码设置。 2.3 读写文本文件python经常用于处理文本,最常见的一种场景就是使用open打开文件从文件输入或者输出到文件,无论是读还是写,我们在打开文件的时候都可以用encoding指定编码类型,比如读取
写入
通过指定相同的encoding参数就可以保证一致,如果是读取外部生成的文件,也只需知道其编码便方便地指定。需要注意的是如果我们不指定,会使用和locale.getdefaultlocale()一致的编码。 2.4 文本流输入输出操作标准的文本输入输出流本质上和操作文件是一样的也是一样的,比如我们常见的读取stdin
但stdin却不像文件一样可以直接显示指定编码类型,如果碰到了相关的编码问题相对更容易让人疑惑,对于stdin、stdout、stderr,python3有一套默认的编码选择规则,比如python 3.7的官方文档解释如下: 对于此类问题主要有以下几个方法可以解决:
三、总结在碰到python3的编码问题时,首先要做地就是分析具体是哪块的编码解码不一致,进而针对性地修改解决,而不是用笼统的“python3编码问题”一通搜索修改,还是要理解真正的具体原因,这样才能够快速准确地解决问题。 参考: |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/28 23:44:41- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |