编码/解码有什么区别?
- 2025-03-18 08:55:00
- admin 原创
- 49
问题描述:
我一直不确定我是否理解 str/unicode 解码和编码之间的区别。
我知道str().decode()
当您有一串字节并且您知道该字符串具有特定的字符编码时,给定该编码名称它将返回一个unicode字符串。
我知道unicode().encode()
根据给定的编码名称将unicode字符转换为字节字符串。
但我不明白str().encode()
和unicode().decode()
的用途。有人能解释一下吗,并能纠正我上面说错的任何其他内容吗?
编辑:
有几个答案提供了关于.encode
字符串的信息,但似乎没有人知道.decode
unicode的作用是什么。
解决方案 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 中,有了单独的byte
和string
类型,这不再是问题。
解决方案 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 解码为 unicode。例如 base64、hex 甚至 rot13。它们列在codecs 模块中。
编辑:
unicode字符串上的解码消息可以撤消相应的编码操作:
In [1]: u'0a'.decode('hex')
Out[1]: '
'
返回的类型是 str 而不是 unicode,我认为这很不幸。但是,当您没有在 str 和 unicode 之间进行正确的编码/解码时,这看起来会很乱。
解决方案 6:
简单的答案是,它们是完全相反的。
计算机使用最基本的单位字节来存储和处理信息;对于人眼来说,它是没有意义的。
例如,'䏿' 代表两个汉字,但只有当计算机获得一本字典来查找该汉字时,它才知道(即打印或存储)它是汉字,在这种情况下,它是一本“utf-8”字典,如果你查找不同的或错误的字典(使用不同的解码方法),它将无法正确显示预期的汉字。
在上面的案例中,计算机查找中文词的过程是decode()
。
而计算机把中文写入计算机内存的过程是encode()
。
因此,编码信息是原始字节,解码信息是原始字节和要引用的字典的名称(但不是字典本身)。
解决方案 7:
两者是互相对立的。
编码是指发送方以某种格式创建消息,以便接收方可以读取。
例如:
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()
解码是指接收方对编码信息的解释。
例如:
打印(base64.b64decode(b'SFExMTE='))
扫码咨询,免费领取项目管理大礼包!