Zen*_*dix 330
计算机可以存储的唯一内容是字节.
要在计算机中存储任何内容,必须先对其进行编码,即将其转换为字节.例如:
MP3,WAV等等.PNG,JPEG等等.ASCII,UTF-8等等.MP3,WAV,PNG,JPEG,ASCII和UTF-8是的示例编码.编码是以字节表示音频,图像,文本等的格式.
在Python中,字节字符串就是:字节序列.它不是人类可读的.在引擎盖下,一切都必须转换为字节串,然后才能存储在计算机中.
另一方面,字符串(通常称为"字符串")是字符序列.它是人类可读的.字符串不能直接存储在计算机中,必须先对其进行编码(转换为字节串).有多种编码可以将字符串转换为字节串,例如ASCII和UTF-8.
'I am a string'.encode('ASCII')
Run Code Online (Sandbox Code Playgroud)
上面的Python代码将'I am a string'使用编码对字符串进行编码ASCII.上面代码的结果将是一个字节字符串.如果你打印它,Python将代表它b'I am a string'.但请记住,字节字符串不是人类可读的,只是Python ASCII在打印时对它们进行解码.在Python中,字节字符串由a表示b,后跟字节字符串的ASCII表示.
如果您知道用于对其进行编码的编码,则可以将字节字符串解码回字符串.
b'I am a string'.decode('ASCII')
Run Code Online (Sandbox Code Playgroud)
上面的代码将返回原始字符串'I am a string'.
编码和解码是逆操作.在将所有内容写入磁盘之前必须对其进行编码,并且必须先对其进行解码才能将其读取.
lvc*_*lvc 221
假设Python 3(在Python 2中,这种差异有点不太明确) - 字符串是一系列字符,即unicode代码点 ; 这些都是抽象的概念,不能直接存储在磁盘上.字节字符串是一系列不出所料的字节 - 可以存储在磁盘上的东西.它们之间的映射是一种编码 - 有很多这些(并且可能无限多) - 你需要知道哪种情况适用于特定情况才能进行转换,因为不同的编码可能映射相同的字节到另一个字符串:
>>> b'\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82'.decode('utf-16')
'?????'
>>> b'\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82'.decode('utf-8')
'?o??o?'
Run Code Online (Sandbox Code Playgroud)
一旦知道要使用哪一个,就可以使用.decode()字节字符串的方法从中获取正确的字符串,如上所示.为完整起见,.encode()字符串的方法方式相反:
>>> '?o??o?'.encode('utf-8')
b'\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82'
Run Code Online (Sandbox Code Playgroud)
lmi*_*asf 12
在Python 2中,str由8位值unicode序列组成,同时由Unicode字符序列组成.需要记住的一点是,如果只包含7位ASCI字符str,unicode则可以与运算符一起使用str.
在Python 3中,bytes由8位值str序列组成,同时由Unicode字符序列组成.bytes并且str不能与像>或等的运营商一起使用+.
这可能是使用辅助功能之间进行转换有用的str和unicode在Python 2之间,以及bytes和str在Python 3.
让我们有一个简单的单字符字符串\'\xc5\xa1\'并将其编码为字节序列:
>>> \'\xc5\xa1\'.encode(\'utf-8\')\nb\'\\xc5\\xa1\'\nRun Code Online (Sandbox Code Playgroud)\n出于本示例的目的,让我们以二进制形式显示字节序列:
\n>>> bin(int(b\'\\xc5\\xa1\'.hex(), 16))\n\'0b1100010110100001\'\nRun Code Online (Sandbox Code Playgroud)\n现在,如果不知道信息是如何编码的,通常不可能将其解码回来。只有知道使用的是UTF-8文本编码,才能按照UTF-8解码算法得到原始字符串:
\n>>> \'\xc5\xa1\'.encode(\'utf-8\')\nb\'\\xc5\\xa1\'\nRun Code Online (Sandbox Code Playgroud)\n您可以将二进制数显示101100001为字符串:
>>> chr(int(\'101100001\', 2))\n\'\xc5\xa1\'\nRun Code Online (Sandbox Code Playgroud)\n
来自什么是 Unicode?:
\n\n\n从根本上来说,计算机只处理数字。它们通过为每个字母和其他字符分配一个数字来存储字母和其他字符。
\n......
\nUnicode 为每个字符提供了一个唯一的编号,无论什么平台、什么程序、什么语言。
\n
因此,当计算机表示一个字符串时,它会通过其唯一的 Unicode 编号找到存储在该字符串的计算机中的字符,并将这些数字存储在内存中。但是你不能直接将字符串写入磁盘或通过其唯一的 Unicode 编号在网络上传输字符串,因为这些数字只是简单的十进制数字。您应该将字符串编码为字节字符串,例如UTF-8。UTF-8 是一种字符编码,能够对所有可能的字符进行编码,并将字符存储为字节(看起来像这样。因此编码后的字符串可以在任何地方使用,因为几乎所有地方都支持 UTF-8。当您从其他系统打开以 UTF-8 编码的文本文件时,您的计算机将对其进行解码并通过其唯一的 Unicode 编号显示其中的字符。
\n当浏览器从网络接收到UTF-8编码的字符串数据时,它会将数据解码为字符串(假设浏览器采用UTF-8编码)并显示该字符串。
\n在Python 3中,您可以将字符串和字节字符串相互转换:
\n>>> print(\'\xe4\xb8\xad\xe6\x96\x87\'.encode(\'utf-8\'))\nb\'\\xe4\\xb8\\xad\\xe6\\x96\\x87\'\n>>> print(b\'\\xe4\\xb8\\xad\\xe6\\x96\\x87\'.decode(\'utf-8\'))\n\xe4\xb8\xad\xe6\x96\x87\nRun Code Online (Sandbox Code Playgroud)\n总之,字符串是为了在计算机上显示给人类阅读,字节串是为了存储到磁盘和数据传输。
\n