我试图在Python中自己理解encode
和decode
但对我来说没有什么是真的。
str.encode([encoding,[errors]])
str.decode([encoding,[errors]])
首先,我不明白在这两个函数中需要“encoding”参数。
每个函数的输出是什么,它的编码是什么?每个函数中“encoding”参数的用途是什么?我真的不明白“字节串”的定义。
我有一个重要问题,是否有某种方法可以从一种编码传递到另一种编码? 我在ASN.1上读过一些关于“八位字符串”的文字,所以我想知道它是否与“字节字符串”相同。
谢谢你的帮助。
答案 0 :(得分:21)
在Python 2中有点复杂(与Python 3相比),因为它将'string'和'bytestring'的概念混淆了很多,但请参阅The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets。基本上,您需要了解的是“字符串”和“字符”是不能由计算机直接表示的抽象概念。 bytestring是直接来自磁盘的原始字节流(或者可以直接从磁盘写入)。 encode
从抽象到具体(你最好给它一个unicode字符串,它会给你一个字节串); decode
正好相反。
编码是这样的规则:“a”应由字节0x61
表示,而'α'由双字节序列0xc0\xb1
表示。
答案 1 :(得分:17)
我在PyCon上的演讲,Pragmatic Unicode, or, How Do I Stop The Pain涵盖了所有这些细节。
简而言之,Unicode字符串是称为代码点的整数序列,而字节串是字节序列。编码是一种将Unicode代码点表示为一系列字节的方法。因此unicode_string.encode(enc)
将返回用“enc”编码的Unicode字符串的字节字符串,byte_string.decode(enc)
将返回通过用“enc”解码字节字符串而创建的Unicode字符串。
答案 2 :(得分:6)
Python 2.x有两种类型的字符串:
str
=“字节字符串”=八位字节序列。这些用于“遗留”字符编码(例如windows-1252或IBM437)和原始二进制数据(例如struct.pack
输出)。unicode
=“Unicode字符串”= UTF-16或UTF-32的序列,具体取决于Python的构建方式。unicode
变为3.x str
(并且从文字中删除了u
前缀。)bytes
类型来表示二进制数据。 character encoding是Unicode字符串和字节字符串之间的映射。要将Unicode字符串转换为字节字符串,请使用encode
方法:
>>> u'\u20AC'.encode('UTF-8')
'\xe2\x82\xac'
要转换其他方式,请使用decode
方法:
>>> '\xE2\x82\xAC'.decode('UTF-8')
u'\u20ac'
答案 3 :(得分:4)
是的,字节字符串是八位字符串。输入/输出文本(从/到控制台,文件,网络......)时会发生编码和解码。您的控制台可能在内部使用UTF-8,您的Web服务器提供latin-1,某些文件格式需要奇怪的编码,如Bibtex的重音:fran\c{c}aise
。您需要在输入/输出上从/转换它们。
{en|de}code
方法执行此操作。它们通常在幕后调用(例如,print "hello world"
将字符串编码为终端使用的任何字符串。