我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python encode和decode

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python encode和decode

今天在写一个StringIO.write(int)示例时思维那么一发散就拐到了字符集的问题上,顺手搜索一发,除了极少数以外,绝大多数中文博客都解释的惨不忍睹,再鉴于被此问题在oracle的字符集体系中蹂躏过,因此在过往笔记的基础上增删了几个示例贴出来。

Python2:

首先清楚两个Python 2中的概念:str和unicode 这是python2中的两种用于表示文本的类型,一般来说你直接打出的字符都属于前者,加了u前缀的字符则属于后者。

  str is text representation in bytes, unicode is text representation in characters.

此观点来自stackoverflow,是得票最多的一个回答,也是我认为最好的一个,但是从我个人的角度来看这个表述依然不足,最适合的表述应当是:

  str is text representation in bytes, unicode is text representation in unicode characters(or unicode bytes).

貌似没多大区别......可能会被人打,但我的意思是python2里的unicode是字符和编码绑定的,只要是unicode类型那么他的编码和字符都已经固定了,但是str类型却只有编码,只有最初打出它的人才知道他的字符是什么(或者说才能通过适当的字符集解码为人眼可懂的字符)。

Python2里的str是十六进制表示的二进制编码,unicode是一个字符:
通俗点来说就是Python2里的str类型是一堆二进制编码,如果不知道是什么字符集那么你除了一堆十六进制
数什么都看不出来(当然平时你使用的工具都是能看到的,因为工具已经做了转码),通过decode可以将其按固定的字符集解码,生成unicode字符。
例如下例(python2环境下的windows cmd窗口):
>>> a='你好'
>>> a.decode('utf-8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\encodings\utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xc4 in position 0: invalid continuation byte
错误的原因是这里的“你好”字符是cp936编码(相当于gbk),utf-8属于非ANSI体系的编码,“你好”的gbk二进制码不符合unicode体系的编码规则因此报错。
>>> print a.decode('gbk'),type(a.decode('gbk'))
你好 <type 'unicode'>
这样就可以啦,既然a是gbk编码的str那么按gbk进行decode解码,自然能得到unicode的你好字符。
decode: str to unicode,decode的输入必须是str类型,输出一定是unicode类型
str.decode(encoding='UTF-8',errors='strict')
​
encode: unicode to str,encode的输入必须是unicode类型,输出一定是str类型
unicode_char.encode(encoding='gbk',errors='strict')

Python3:

在Python3中str调用decode()方法会遇到: AttributeError: 'str' object has no attribute 'decode' .

why?

这是因为python3中表示文本的只有一种类型了,那就是str,你以为这是python2里的那个str吗?No! 这个str是python2中的unicode类型......

那么原来的str哪里去了?被命名为bytes类型了,decode方法也随之给了bytes类型,encode给了str类型。

这样做的好处是:

在Python2中str和unicode都有decode,encode两种方法,但是字符集参数不设置正确的话,函数经常报错,文本能否正确流通取决于大家是否清楚输入编码的字符集,这对于全球化的网站来说是个巨坑,而在Python3中无论你输入什么字符,统一都是str类型的(也就是python2里的unicode类型),通过bytes和str类型的分离将decode,encode这两种方法分离,encode函数不会出错,因为编码与字符集是绑定的,你可以随意将unicode字符转化为任意ANSI体系字符集的bytes类型,此时在已知ANSI字符集的情况下,你对bytes类型的decode转码一定不会出错。通过这种方式就避免了python2中输入str类型带来的编码混乱问题。

[root@python ~]# python3
Python 3.6.5 (default, Apr  9 2018, 17:15:34) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> a='你好'
>>> type(a)
<class 'str'>
>>> a.encode('gbk')
b'\xc4\xe3\xba\xc3'
>>> type(a.encode('gbk'))
<class 'bytes'>
通过encode方式我们可以把unicode字符转为任意字符集的bytes类型,这种bytes类型可以通过decode()来重新转为unicode。

使用相似的观点来表述Python3中的bytes和str的区别就是:

 bytes is text representation in bytes only if you know the charset, str is text representation in unicode characters(or unicode bytes).

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python encode和decode

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python encode和decode

今天在写一个StringIO.write(int)示例时思维那么一发散就拐到了字符集的问题上,顺手搜索一发,除了极少数以外,绝大多数中文博客都解释的惨不忍睹,再鉴于被此问题在oracle的字符集体系中蹂躏过,因此在过往笔记的基础上增删了几个
2023-01-30

python的encode和decode

python的encode和decode误读总结    最近在学Python,对编码有个误解的地方    下面是错误的理解:    encode():编码,将对象的编码转换为指定编码格式,按照字面理解,一直以为是其他编码格式转换成unico
2023-01-31

PYTHON的decode和encode

1、decode字面含义# 解码:将字节码按照编码规则解析成我们想要的内容# 举例:帅’的utf-8编码是 ‘E5 B8 85’[in]b'\xe5\xb8\x85'.decode('utf8')[out]'帅'# 注:\x表示16进制,\
2023-06-02

python decode encode

decode , to unicodeencode, from unicode这有篇很好的文章,可以明白这个问题:为什么会报错“UnicodeEncodeError: 'ascii' codec can't encode character
2023-01-31

python中encode和decode函数说明

python中encode和decode函数说明 1. 简介字符串编码常用类型:utf-8,gb2312,cp936,gbk等。python中,我们使用decode()和encode()来进行解码和编码,使用unicode类型作为编码的
2023-06-02

Python encode()方法和decode()方法详解

encode()方法为字符串类型(str)提供的方法,用于将str类型转换成bytes类型,这个过程也称为“编码”,这篇文章主要介绍了Python encode()方法和decode()方法,需要的朋友可以参考下
2022-12-28

Python字符串编码转换encode()和decode()方法怎么使用

这篇文章主要讲解了“Python字符串编码转换encode()和decode()方法怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python字符串编码转换encode()和deco
2023-06-25

python编码encode和decod

计算机里面,编码方法有很多种,英文的一般用ascii,而中文有unicode,utf-8,gbk,utf-16等等。unicode是 utf-8,gbk,utf-16这些的父编码,这些子编码都能转换成unicode编码,然后转化成子编码,例
2023-01-31

python中文decode和encod

字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。    deco
2023-01-31

Python URL编解码 encode

urllib包中parse模块的quote和unquotefrom urllib import parse#这个是js的结果# encodeURIComponent('中国')# "%E4%B8%AD%E5%9B%BD"jsRet='%E4
2023-01-31

python decode函数的用法是什么

decode() 函数用于将字符串解码为指定的编码格式。其语法如下:decode(encoding="utf-8", errors="strict")其中,encoding 参数指定要使用的编码类型,errors 参数指定在编码过程中遇到
python decode函数的用法是什么
2024-03-13

python中decode函数怎么使用

在 Python 中,decode() 函数用于将字符串转换为指定的编码格式。下面是 decode() 函数的使用方法:```pythonstring.decode(encoding, errors)```其中,encoding 是要使用的
2023-09-15

python解决汉字编码问题:Unicode Decode Error

前言 最近由于项目需要,需要读取一个含有中文的txt文档,完了还要保存文件。文档之前是由base64编码,导致所有汉字读取显示乱码。项目组把base64废弃之后,先后出现两个错误:ascii codec can't encode chara
2022-06-04

DECODE 函数和 CASE-WHEN 表达式的比较

在 SQL 中我们通常认为以下两种写法是等价的: DECODE(PARAM, VALUE1, RESULT1, [VALUE2, RESULT2, ...] DEFAULT_RESULT) CASE PARAM WHEN VALUE1 THEN RESULT1
DECODE 函数和 CASE-WHEN 表达式的比较
2017-03-23

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录