编码/解码有什么区别?

2025-03-18 08:55:00
admin
原创
48
摘要:问题描述:我一直不确定我是否理解 str/unicode 解码和编码之间的区别。我知道str().decode()当您有一串字节并且您知道该字符串具有特定的字符编码时,给定该编码名称它将返回一个unicode字符串。我知道unicode().encode()根据给定的编码名称将unicode字符转换为字节字符...

问题描述:

我一直不确定我是否理解 str/unicode 解码和编码之间的区别。

我知道str().decode()当您有一串字节并且您知道该字符串具有特定的字符编码时,给定该编码名称它将返回一个unicode字符串。

我知道unicode().encode()根据给定的编码名称将unicode字符转换为字节字符串。

但我不明白str().encode()unicode().decode()的用途。有人能解释一下吗,并能纠正我上面说错的任何其他内容吗?

编辑:

有几个答案提供了关于.encode字符串的信息,但似乎没有人知道.decodeunicode的作用是什么。


解决方案 1:

unicode 字符串方法decode实际上根本没有任何应用(除非出于某种原因,unicode 字符串中包含一些非文本数据 - 见下文)。我认为它的存在主要是出于历史原因。在 Python 3 中它已经完全消失了。

unicode().decode()将使用默认 (ascii) 编解码器执行隐式编码。请按如下方式验证s

>>> s = u'ö'
>>> s.decode()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'xf6' in position 0:
ordinal not in range(128)

>>> s.encode('ascii')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'xf6' in position 0:
ordinal not in range(128)

错误信息完全相同。

因为str().encode()它是相反的——它尝试用默认编码进行隐式解码:s

>>> s = 'ö'
>>> s.decode('utf-8')
u'xf6'
>>> s.encode()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0:
ordinal not in range(128)

这样用,str().encode()也是多余的。

但是后一种方法还有另一种有用的应用:有些编码与字符集无关,因此可以以有意义的方式应用于 8 位字符串:

>>> s.encode('zip')
'xx9c;xbc
x00x02>x01z'

不过,您说得对:这两个应用程序对“编码”的模糊使用……很尴尬。同样,在 Python 3 中,有了单独的bytestring类型,这不再是问题。

解决方案 2:

将 unicode 字符串表示为字节字符串称为编码。使用u'...'.encode(encoding)

例子:

    >>> u' '.encode('utf8')
    'xc3x83xc2xa6xc3x83xc2xb8xc3x83xc2xa5'
    >>> u'æøå'.encode('latin1')
    'xc3xa6xc3xb8xc3xa5'
    >>> u'æøå'.encode('ascii')
    UnicodeEncodeError:'ascii'编解码器无法对位置0-5的字符进行编码:
    序数不在范围内(128)

每当您需要将 unicode 字符串用于 IO 时,您通常会对其进行编码,例如通过网络传输它,或将其保存到磁盘文件。

将字节串转换为unicode字符串称为解码。使用unicode('...', encoding)或'...'.decode(encoding)。

例子:

   >>> 你
   u'xc3xa6xc3xb8xc3xa5' # 解释器打印 unicode 对象如下
   >>> unicode('xc3xa6xc3xb8xc3xa5', 'latin1')
   u'xc3xa6xc3xb8xc3xa5'
   >>>'xc3xa6xc3xb8xc3xa5'.解码('latin1')
   u'xc3xa6xc3xb8xc3xa5'

当您从网络或磁盘文件接收字符串数据时,通常需要解码一串字节。

我相信在 python 3 中 unicode 处理有一些变化,所以上述内容对于 python 3 来说可能不正确。

一些好的链接:

  • 每个软件开发人员必须绝对、积极地了解有关 Unicode 和字符集的最低要求(没有借口!)

  • Unicode 指南

解决方案 3:

anUnicode.encode ('encoding') 生成一个字符串对象,可以在 unicode 对象上调用

aString.decode ('encoding') 生成一个unicode对象,可以在以给定编码进行编码字符串上调用。


更多解释:

您可以创建一些没有任何编码设置的 unicode 对象。Python 在内存中存储它的方式与您无关。您可以搜索它、拆分它并调用您喜欢的任何字符串处理函数。

但有时,您想将 unicode 对象打印到控制台或某个文本文件中。因此,您必须对其进行编码(例如 - 以 UTF-8 编码),调用 encode('utf-8'),然后您会得到一个包含 '/u<someNumber>' 的字符串,该字符串完全可以打印。

然后,再次 - 您想做相反的事情 - 读取以 UTF-8 编码的字符串并将其视为 Unicode,因此 /u360 将是一个字符,而不是 5 个。然后您解码一个字符串(使用选定的编码)并获取 unicode 类型的全新对象。

顺便提一下 - 您可以选择一些不正确的编码,例如“zip”,“base64”,“rot”,其中一些会从字符串转换为字符串,但我相信最常见的情况是涉及 UTF-8/UTF-16 和字符串的情况。

解决方案 4:

mybytestring.encode(somecodec) 对于以下值有意义somecodec

  • base64

  • bz2

  • 十六进制

  • 阔普里

  • rot13

  • 字符串转义

我不确定对已解码的 unicode 文本进行解码有什么用。尝试使用任何编码似乎总是首先尝试使用系统的默认编码进行编码。

解决方案 5:

有几种编码可用于将 str 解码为 str 或将 unicode 解码为 un​​icode。例如 base64、hex 甚至 rot13。它们列在codecs 模块中。

编辑:

unicode字符串上的解码消息可以撤消相应的编码操作:

In [1]: u'0a'.decode('hex')
Out[1]: '
'

返回的类型是 str 而不是 unicode,我认为这很不幸。但是,当您没有在 str 和 unicode 之间进行正确的编码/解码时,这看起来会很乱。

解决方案 6:

简单的答案是,它们是完全相反的。

计算机使用最基本的单位字节来存储和处理信息;对于人眼来说,它是没有意义的。

例如,'中文' 代表两个汉字,但只有当计算机获得一本字典来查找该汉字时,它才知道(即打印或存储)它是汉字,在这种情况下,它是一本“utf-8”字典,如果你查找不同的或错误的字典(使用不同的解码方法),它将无法正确显示预期的汉字。

在上面的案例中,计算机查找中文词的过程是decode()

而计算机把中文写入计算机内存的过程是encode()

因此,编码信息是原始字节,解码信息是原始字节和要引用的字典的名称(但不是字典本身)。

解决方案 7:

两者是互相对立的。

  1. 编码是指发送方以某种格式创建消息,以便接收方可以读取。

例如:

import base64
def read_csv_file():
 with open( r'File_Path.csv', 'r') as fb:
   csv_read = csv.DictReader(fb)
   for row in csv_read:
     id = row["EMP_ID"].encode("ascii")
     x = base64.b64encode(bytes(id))      #encode
     print(x)
read_csv_file()
  1. 解码是指接收方对编码信息的解释。

例如:

打印(base64.b64decode(b'SFExMTE='))

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2482  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1533  
  PLM(产品生命周期管理)项目对于企业优化产品研发流程、提升产品质量以及增强市场竞争力具有至关重要的意义。然而,在项目推进过程中,范围蔓延是一个常见且棘手的问题,它可能导致项目进度延迟、成本超支以及质量下降等一系列不良后果。因此,有效避免PLM项目范围蔓延成为项目成功的关键因素之一。以下将详细阐述三大管控策略,助力企业...
plm系统   0  
  PLM(产品生命周期管理)项目管理在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和产品复杂度的提升,PLM项目面临着诸多风险。准确量化风险优先级并采取有效措施应对,是确保项目成功的关键。五维评估矩阵作为一种有效的风险评估工具,能帮助项目管理者全面、系统地评估风险,为决策提供有力支持。五维评估矩阵概述...
免费plm软件   0  
  引言PLM(产品生命周期管理)开发流程对于企业产品的全生命周期管控至关重要。它涵盖了从产品概念设计到退役的各个阶段,直接影响着产品质量、开发周期以及企业的市场竞争力。在当今快速发展的科技环境下,客户对产品质量的要求日益提高,市场竞争也愈发激烈,这就使得优化PLM开发流程成为企业的必然选择。缺陷管理工具和六西格玛方法作为...
plm产品全生命周期管理   0  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用