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

b'The string'

我想知道:

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

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

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

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


当前回答

它将其转换为bytes字面值(或2.x中的str),并且对2.6+有效。

r前缀导致反斜杠“未解释”(不会被忽略,两者之间的差异很重要)。

其他回答

b表示字节字符串。

字节是实际的数据。字符串是一种抽象。

如果你有一个多字符的字符串对象,你取一个字符,它将是一个字符串,它的大小可能超过1字节,这取决于编码。

如果使用字节字符串的1个字节,您将得到一个从0-255的8位值,如果这些字符由于编码是> 1字节,那么它可能不代表一个完整的字符。

TBH我会使用字符串,除非我有一些特定的低级别的理由使用字节。

除了其他人所说的,请注意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

它将其转换为bytes字面值(或2.x中的str),并且对2.6+有效。

r前缀导致反斜杠“未解释”(不会被忽略,两者之间的差异很重要)。

引用Python 2。x文档:

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

Python 3文档声明:

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

Bytes (somestring.encode())是在python 3中为我工作的解决方案。

def compare_types():
    output = b'sometext'
    print(output)
    print(type(output))


    somestring = 'sometext'
    encoded_string = somestring.encode()
    output = bytes(encoded_string)
    print(output)
    print(type(output))


compare_types()