返回顶部
首页 > 资讯 > 后端开发 > Python >Python encode和decode
  • 454
分享到

Python encode和decode

Pythonencodedecode 2023-01-30 23:01:58 454人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

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

今天在写一个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).

--结束END--

本文标题: Python encode和decode

本文链接: https://lsjlt.com/news/180695.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python encode和decode
    今天在写一个StringIO.write(int)示例时思维那么一发散就拐到了字符集的问题上,顺手搜索一发,除了极少数以外,绝大多数中文博客都解释的惨不忍睹,再鉴于被此问题在oracle的字符集体系中蹂躏过,因此在过往笔记的基础上增删了几...
    99+
    2023-01-30
    Python encode decode
  • python的encode和decode
    python的encode和decode误读总结    最近在学Python,对编码有个误解的地方    下面是错误的理解:    encode():编码,将对象的编码转换为指定编码格式,按照字面理解,一直以为是其他编码格式转换成unico...
    99+
    2023-01-31
    python encode decode
  • PYTHON的decode和encode
    1、decode字面含义# 解码:将字节码按照编码规则解析成我们想要的内容# 举例:帅’的utf-8编码是 ‘E5 B8 85’[in]b'\xe5\xb8\x85'.decode('utf8')[out]'帅'# 注:\x表示16进制,\...
    99+
    2023-06-02
  • python decode encode
    decode , to unicodeencode, from unicode这有篇很好的文章,可以明白这个问题:为什么会报错“UnicodeEncodeError: 'ascii' codec can't encode character...
    99+
    2023-01-31
    python decode encode
  • python中encode和decode函数说明
     python中encode和decode函数说明 1.  简介字符串编码常用类型:utf-8,gb2312,cp936,gbk等。python中,我们使用decode()和encode()来进行解码和编码,使...
    99+
    2023-06-02
  • Python encode()方法和decode()方法详解
    目录Python encode()方法Python decode()方法Python encode()方法 encode() 方法为字符串类型(str)提供的方法,用于将 str 类...
    99+
    2022-12-28
    Python encode()方法 Python decode()方法
  • Python字符串编码转换encode()和decode()方法怎么使用
    这篇文章主要讲解了“Python字符串编码转换encode()和decode()方法怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python字符串编码转换encode()和deco...
    99+
    2023-06-25
  • Python字符串编码转换encode()和decode()方法详细说明
    目录1.Python encode()方法 2.Python decode()方法 前言: 我们知道,最早的字符串编码是 ASCII 编码,它仅仅对 10 个数字、26 个大小写英文...
    99+
    2024-04-02
  • python编码encode和decod
    计算机里面,编码方法有很多种,英文的一般用ascii,而中文有unicode,utf-8,gbk,utf-16等等。 unicode是 utf-8,gbk,utf-16这些的父编码,这些子编码都能转换成unicode编码,然后转化成子编码,...
    99+
    2023-01-31
    python encode decod
  • 关于feign对x-www-form-urlencode类型的encode和decode问题
    目录对x-www-form-urlencode类型的encode和decode问题问题场景问题原因可能的解决办法(没来得及尝试)附:feign的调用栈feignx-www-form-...
    99+
    2024-04-02
  • python中文decode和encod
       字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。    ...
    99+
    2023-01-31
    中文 python encod
  • Python URL编解码 encode
    urllib包中parse模块的quote和unquote from urllib import parse #这个是js的结果 # encodeURIComponent('中国') # "%E4%B8%AD%E5%9B%BD...
    99+
    2023-01-31
    编解码 Python URL
  • Python中decode函数怎么用
    在Python中使用decode函数的方法decode:decode()函数的作用是指定的编码格式解码字符串。decode()函数语法:str.decode(encoding='UTF-8',errors='strict')参数:encod...
    99+
    2024-04-02
  • oracle decode函数和 sign函数
    流程控制函数 DECODEdecode()函数简介:主要作用:将查询结果翻译成其他值(即以其他形式表现出来,以下举例说明);使用方法:Select decode(columnname,值1,翻译值...
    99+
    2024-04-02
  • python中decode函数怎么使用
    在 Python 中,decode() 函数用于将字符串转换为指定的编码格式。下面是 decode() 函数的使用方法:```pyt...
    99+
    2023-09-15
    python decode
  • oracle中case和decode如何使用
    这期内容当中小编将会给大家带来有关oracle中case和decode如何使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 总结: DE...
    99+
    2024-04-02
  • python decode函数的用法是什么
    decode() 函数用于将字符串解码为指定的编码格式。其语法如下: decode(encoding="utf-8&quo...
    99+
    2024-03-13
    python
  • python解决汉字编码问题:Unicode Decode Error
    前言 最近由于项目需要,需要读取一个含有中文的txt文档,完了还要保存文件。文档之前是由base64编码,导致所有汉字读取显示乱码。项目组把base64废弃之后,先后出现两个错误: ascii code...
    99+
    2022-06-04
    汉字 python Unicode
  • DECODE 函数和 CASE-WHEN 表达式的比较
    在 SQL 中我们通常认为以下两种写法是等价的: DECODE(PARAM, VALUE1, RESULT1, [VALUE2, RESULT2, ...] DEFAULT_RESULT) CASE PARAM WHEN VALUE1 ...
    99+
    2017-03-23
    DECODE 函数和 CASE-WHEN 表达式的比较
  • 【python】报错UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte in position : illegal multibyte
    python读文件时报错: Traceback (most recent call last): File "xxx.py", line 3, in for line in input_fi...
    99+
    2023-09-30
    python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作