显然,以下是有效的语法:

b'The string'

我想知道:

字符串前面的b是什么意思? 使用它的效果是什么? 在什么情况下使用它比较合适?

我在SO上找到了一个相关的问题,但这个问题是关于PHP的,它指出b是用来表示字符串是二进制的,而不是Unicode,这是需要代码从PHP < 6版本兼容,当迁移到PHP 6时。我不认为这适用于Python。

我确实在Python网站上找到了这个文档,是关于使用u字符以相同的语法指定字符串作为Unicode的。不幸的是,该文档中没有任何地方提到b字符。

另外,出于好奇,除了b和u还有别的符号吗?


当前回答

下面是一个例子,在Python 3.x中,缺少b将抛出TypeError异常

>>> f=open("new", "wb")
>>> f.write("Hello Python!")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' does not support the buffer interface

加上一个b前缀就能解决这个问题。

其他回答

引用Python 2。x文档:

前缀'b'或'b'会被忽略 Python 2;它表明 字面量应该变成字节字面量 在Python 3中(例如,当代码是 自动转换为2to3)。一个 'u'或'b'前缀后面可以跟着 一个'r'前缀。

Python 3文档声明:

字节字面值总是以'b'或'b'作为前缀;它们生成bytes类型的实例,而不是STR类型的实例。它们可能只包含ASCII字符;数值为128或更大的字节必须用转义来表示。

下面是一个例子,在Python 3.x中,缺少b将抛出TypeError异常

>>> f=open("new", "wb")
>>> f.write("Hello Python!")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' does not support the buffer interface

加上一个b前缀就能解决这个问题。

从服务器端,如果我们发送任何响应,它将以字节类型的形式发送,因此它将在客户端显示为b' response From server'

为了消去b'....'只需使用下面的代码:

服务器文件:

stri="Response from server"    
c.send(stri.encode())

客户端文件:

print(s.recv(1024).decode())

然后打印Response from server

除了其他人所说的,请注意unicode中的单个字符可以包含多个字节。

unicode的工作方式是,它采用了旧的ASCII格式(7位代码,看起来像0xxx xxxx),并添加了多字节序列,其中所有字节都以1 (1xxx xxxx)开头,以表示ASCII以外的字符,以便unicode与ASCII向后兼容。

>>> len('Öl')  # German word for 'oil' with 2 characters
2
>>> 'Öl'.encode('UTF-8')  # convert str to bytes 
b'\xc3\x96l'
>>> len('Öl'.encode('UTF-8'))  # 3 bytes encode 2 characters !
3

问题的答案是:

data.encode()

为了解码它(去掉b,因为有时候你不需要它)

use:

data.decode()