Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >python 语法基础之字符集编码

python 语法基础之字符集编码

原创
作者头像
kevindi
发布于 2018-09-10 12:11:28
发布于 2018-09-10 12:11:28
1.6K00
代码可运行
举报
文章被收录于专栏:python 实践经验python 实践经验
运行总次数:0
代码可运行

Python初学者编码实践中经常遇到encode error,decode error,如下:

例1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
UnicodeEncodeError: 'ascii' codec can't encode character u'\u5728' in position 1

例2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
UnicodeDecodeError: 'utf-8' codec can't decode bytes in position 0-1: invalid continuation byte

1、百度的时候,大家都建议在代码文件头加上字符集定义:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- coding: utf-8 -*-

这种方法大部分情况下可以解决大部分的问题。那么它解决的是什么问题呢?

我们需要理解两个概念:

1)、# -*- coding: utf-8 -*- 的作用是声明 python源代码文件的编码格式。 谁会读取Python的源代码呢? 一个是IDE编辑工具,比如pycharm,nodpad++,editpluss等,我们在写代码的时候使用。

2)、另一个是Python解释器,是执行Python程序的时候使用。

当我们使用IDE编辑器打开Python代码的时候,如果出现乱码,我们都知道是编辑器的解码方式和代码文件的编码方式不一致导致的。需要修改编辑器的解码方式。

那么Python解释执行Python程序的时候使用的是设么解码方式呢?可以用下面的方式查看:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sys.getdefaultencoding()

可以用下面的方式修改:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
reload(sys)
sys.setdefaultencoding('utf-8')
sys.getdefaultencoding()

所以,代码文件第一行加 字符集定义,解决Python解释器读取Python代码文件时的字符集识别问题

2、在print的时候出现异常,或者写文件,或者解析网络报文,或者做str对象处理的时候出现乱码。

这个时候我们需要理解:

1)、文件读写、网络报文读写都可以理解为IO读写。是byte处理,所以读写前后需要使用同样的字符编码方式。

2)、print、str对象的处理涉及到终端的编码格式。print之后,在pycharm的输出窗口,或者windows的CMD命令行窗口,或者Linux的shell窗口,需要适配终端的编码方式

3)、字符编码基本可分为三大类:起源于美国的ASCII,支持英文字符、数字、标点符号、键盘上的特殊字符;国际编码unicode,支持ascII的字符集外,又支持中文,韩语,日语等。因为unicode占用空间大,所以又出现了utf-8。需要强调的一点是

unicode:简单粗暴,所有字符都是2Bytes,优点是字符->数字的转换速度快,缺点是占用空间大

utf-8:精准,对不同的字符用不同的长度表示,优点是节省空间,缺点是:字符->数字的转换速度慢,因为每次都需要计算出字符需要多长的Bytes才能够准确表示

1.内存中使用的编码是unicode,用空间换时间(程序都需要加载到内存才能运行,因而内存应该是尽可能的保证快)

2.硬盘中或者网络传输用utf-8,网络I/O延迟或磁盘I/O延迟要远大与utf-8的转换延迟,而且I/O应该是尽可能地节省带宽,保证数据传输的稳定性。

下面详细介绍了unicode和utf-8的使用场景:

在程序执行之前,内存中确实都是unicode编码的二进制,比如从文件中读取了一行x="egon",其中的x,等号,引号,地位都一样,都是普通字符而已,都是以unicode编码的二进制形式存放与内存中的

但是程序在执行过程中,会申请内存(与程序代码所存在的内存是俩个空间),可以存放任意编码格式的数据,比如x="egon",会被python解释器识别为字符串,会申请内存空间来存放"egon",然后让x指向该内存地址,此时新申请的该内存地址保存也是unicode编码的egon,如果代码换成x="egon".encode('utf-8'),那么新申请的内存空间里存放的就是utf-8编码的字符串egon了

针对python3如下图

浏览网页的时候,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器

如果服务端encode的编码格式是utf-8, 客户端内存中收到的也是utf-8编码的二进制。

从上面的说明,我们知道了unicode和utf-8的应用场景,就需要用下面的方式进行转换:

字符串通过编码转换为字节码,字节码通过解码转换为字符串

str--->(encode)--->bytes,bytes--->(decode)--->str

参考:

https://www.cnblogs.com/zihe/p/6993891.html

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
python基础之字符编码
计算机由美国人发明,最早的字符编码为ASCII,只规定了英文字母数字和一些特殊字符与数字的对应关系。最多只能用 8 位来表示(一个字节),即:2**8 = 256,所以,ASCII码最多只能表示 256 个符号
py3study
2020/01/19
7270
python基础之字符编码
详解Python字符串编码格式
最早的字符串编码是美国标准信息交换码ASCII,仅对10个数字、26个大写英文字母、26个小写英文字母及一些其他符号进行了编码。ASCII采用1个字节来对字符进行编码,最多只能表示256个符号。 随着信息技术的发展和信息交换的需要,各国的文字都需要进行编码,不同的应用领域和场合对字符串编码的要求也略有不同,于是又分别设计了多种不同的编码格式,常见的主要有UTF-8、UTF-16、UTF-32、GB2312、GBK、CP936、base64、CP437等等。UTF-8编码是国际通用的编码,以1个字节表示英语字
Python小屋屋主
2018/04/16
1.9K0
令人头疼的Python编码问题
你是否在编写Python代码时,老是遇到UnicodeDecodeError/UnicodeEncodeError错误,无从下手。或者是打印一串字符串,确是乱码,搞人心态。
罗罗攀
2021/03/03
7020
python decode encode
为什么会报错“UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)”?本文就来研究一下这个问题。
py3study
2020/01/10
2.7K0
python2.7 的中文编码处理,解决UnicodeEncodeError: 'ascii' codec can't encode character 问题
最近业务中需要用 Python 写一些脚本。尽管脚本的交互只是命令行 + 日志输出,但是为了让界面友好些,我还是决定用中文输出日志信息。 很快,我就遇到了异常: UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128) 为了解决问题,我花时间去研究了一下 Python 的字符编码处理。网上也有不少文章讲 Python 的字符编码,但是我看过一遍,觉得自己可以讲得
用户1214487
2018/05/28
16.2K0
字符、字符集、编码,以及它们python中会遇到的一些问题(下)
在看了很多的博客文章之后,总结整理得到了以下文章,非常感谢这些无私奉献的博主! 文章末尾有本文引用的文章的链接,如果有漏掉的文章引用,可以发邮件联系我,随后再次附上链接! 侵删!!! 这一部分是下篇,主要讲的是编码部分,以及在python中会遇到的一些编码问题,偏向于实际应用一点。 上篇介绍了字符、字符集的一些概念,以及他们在python中的一些简单的代码示例,偏向于概念。 上篇地址:http://www.cnblogs.com/echo-coding/p/7435118.html 这绝对是个源
Echo_fy
2018/06/20
2K0
Python中编码问题(UnicodeDecodeError)的处理
之前也遇到过,但是没有深入的去了解和测试,今天借此问题,对python的编码问题做个详细的学习;首先说明一点的是,目前公司的开发环境是Python 2.7;
SEian.G
2021/03/18
3.9K0
Python13 字符转编码
最开始电脑的字符集是ASCII,英文在ASCII中每个字母占1个字节,但ASCII不支持中文,所以后来出现了Unicode;
py3study
2020/01/07
7530
python之字符编码的重要思想
        unicode----->encode-------->utf-8
超蛋lhy
2018/08/31
5180
python之字符编码的重要思想
Python-基础05-字符编码
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
DriverZeng
2022/09/26
6560
Python-基础05-字符编码
Python字符编码全解析
字符编码是计算机编程中不可回避的问题,不管你用 Python2 还是 Python3,亦或是 C++, Java 等,我都觉得非常有必要厘清计算机中的字符编码概念。本文主要分以下几个部分介绍: 基本概念 常见字符编码简介 Python 的默认编码 Python2 中的字符类型 UnicodeEncodeError & UnicodeDecodeError 根源 基本概念 字符(Character) 在电脑和电信领域中,字符是一个信息单位,它是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字
小小科
2018/05/04
1.4K0
Python字符编码全解析
Python 中有关中文编码解码小记
3、python 头顶部设置的编码格式 # _*_ coding: utf-8 _*_  不会影响默认python 的默认编码格式
py3study
2020/01/10
5990
深入理解Python中的字符编码与解码:字符集、Unicode与实用操作详解
在Python编程中,处理字符编码和解码是一个常见但也容易出错的任务。随着计算机软硬件的发展,字符集和Unicode编码成为了解决字符处理问题的主要方法。本文将介绍Python中字符编码与解码的基本概念,并提供一些实用的代码示例。
一键难忘
2024/06/28
6140
python 字符编码与转换
比如一款游戏《大话西游》用的是gbk编码开发的。出口到欧美国家,是无法直接运行的。
py3study
2018/08/02
1.6K0
python 之字符编码
相同点:python解释器是解释执行文件内容的,因而python解释器具备读py文件的功能,这一点与文本编辑器一样
全栈程序员站长
2022/07/21
8900
python 之字符编码
python--一文搞懂字符串的编解码
我们在使用python处理中文字符串时总会遇到一些问题,特别是一些老项目需要用到python2,中文显示乱码,文件读写异常等问题时常发生。
languageX
2023/05/04
1.6K0
python编码问题一点通
一、了解字符编码的知识储备   1. 文本编辑器存取文件的原理(nodepad++,pycharm,word)      打开编辑器就打开了启动了一个进程,是在内存中的,所以在编辑器编写的内容也都是存放与内存中的,断电后数据丢失,因而需要保存到硬盘上,点击保存按钮,就从内存中把数据刷到了硬盘上。在这一点上,我们编写一个py文件(没有执行),跟编写其他文件没有任何区别,都只是在编写一堆字符而已。     即:在没有点击保存时,我们所写的内容都是写入内存。注意这一点,很重要!!当我们点击保存,内容才被刷到硬盘
用户1214487
2018/01/23
1.1K0
python编码问题一点通
python字符编码与转码
    1.python2.X 默认编码是ascii ;支持中文需要加“ #-*- coding:utf-8 ”;
py3study
2020/01/13
4.9K0
哇,原来python字符串是这样的!
python中的字符串一直是困扰小编的一大难题,相信大家伙也曾体验过被各种编码支配的恐惧吧。不过没关系,相信你读了这篇文章,一定会对python字符串豁然开朗! 代码链接:https://github.com/princewen/professional-python3 一、字符串类型 python3: """ python语言有两种不同的字符串,一个用于存储文本,一个用于存储原始字节 文本字符串内部使用Unicode存储,字节字符串存储原始字节并显示ASCII """ """ python3中,文本型
石晓文
2018/04/11
9440
Python2和Python3的一些语法区别
Python2和Python3的一些语法区别 python 1.print 在版本2的使用方法是: print 'this is version 2 也可以是 print('this is version 2') 但到了3,就只能加上括号,像一个函数一样来使用 print: print('this is version 3') 2.input 2里面有两个用来从命令行接受输入的函数:input 和raw_input。 value = input() input接收的是一个值或变量,也就是说,你如果输
用户1214487
2018/01/23
1.4K0
Python2和Python3的一些语法区别
相关推荐
python基础之字符编码
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验