Python 什么是';b';字符串文本前面的字符是什么?
显然,以下是有效的语法:Python 什么是';b';字符串文本前面的字符是什么?,python,string,unicode,binary,Python,String,Unicode,Binary,显然,以下是有效的语法: my_string = b'The string' 我想知道: 字符串前面的b字符是什么意思 使用它有什么效果 使用它的适当情况是什么 我在这里找到了一个,但是这个问题是关于PHP的,它指出b用于表示字符串是二进制的,而不是Unicode,在迁移到PHP6时,Unicode是代码与PHP
my_string = b'The string'
我想知道:
b
字符是什么意思b
用于表示字符串是二进制的,而不是Unicode,在迁移到PHP6时,Unicode是代码与PHP<6版本兼容所必需的。我认为这不适用于Python
我确实在Python站点上发现了使用u
字符以相同的语法将字符串指定为Unicode。不幸的是,它没有提到文档中的b字符
此外,出于好奇,是否有比b
和u
更多的符号可以做其他事情?引述如下:
在中忽略前缀“b”或“b”
Python 2;这表明
文字应该变成字节文字
在Python 3中(例如,当代码
自动转换为2to3)。A.
“u”或“b”前缀后面可以跟
“r”前缀
各国:
字节文本总是以“b”或“b”作为前缀;它们生成字节类型而不是str类型的实例。它们只能包含ASCII字符;数值大于等于128的字节必须用转义符表示
它将其转换为
字节
文字(或2.x中的str
),并对2.6+有效
r
前缀会导致反斜杠“不被解释”(不被忽略,差异也很重要)。b表示字节字符串
字节是实际数据。字符串是一种抽象
若你们有一个多字符的字符串对象,你们只需要一个字符,那个么它就是一个字符串,根据编码的不同,它的大小可能超过1字节
如果使用字节字符串获取1个字节,您将从0-255中获得一个8位值,并且如果由于编码而产生的字符大于1字节,则可能无法表示完整的字符
TBH我会使用字符串,除非我有使用字节的特定低级原因。对类型进行了明确区分:
=str
literals=一系列Unicode字符(拉丁文1、UCS-2或UCS-4)'…'
=bytes
literals=八位字节序列(0到255之间的整数)b'…'
- Java或C#,将
看作str
和String
看作bytes
李>byte[]
- SQL,将
看作str
和NVARCHAR
看作bytes
或BINARY
李>BLOB
- Windows注册表,将
看作str
和REG\u SZ
看作bytes
REG\u BINARY
char
和字符串的一切,因为字符不是字节。这种想法早已过时
当您想要表示文本时,可以使用str
print('שלום עולם')
当您想要表示底层二进制数据(如结构)时,可以使用bytes
NaN = struct.unpack('>d', b'\xff\xf8\x00\x00\x00\x00\x00\x00')[0]
您可以将str
转换为bytes
对象
>>> '\uFEFF'.encode('UTF-8')
b'\xef\xbb\xbf'
您可以将字节
解码为str
>>> b'\xE2\x82\xAC'.decode('UTF-8')
'€'
但你不能随意混合这两种类型
>>> b'\xEF\xBB\xBF' + 'Text with a UTF-8 BOM'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't concat bytes to str
但我必须强调,字符不是字节
>>> 'A' == b'A'
False
在Python2.x中
Python的3.0之前版本缺少文本和二进制数据之间的这种区别。相反,有:
=unicode
literals=unicode字符序列=3.xu'…'
str
=str
literals=混乱的字节/字符序列'…'
- 通常是文本,用一些未指定的编码编码
- 但也用于表示二进制数据,如
outputstruct.pack
b'…'
文本语法后移植到Python2.6,以便能够区分二进制字符串(3.x中应该是bytes
)和文本字符串(3.x中应该是str
)。b
前缀在2.x中不起任何作用,但告诉2to3
脚本不要将其转换为3.x中的Unicode字符串
因此,是的,b'…'
Python中的文字与PHP中的文字具有相同的用途
还有,只是出于好奇,有吗
比b和u更多的符号
其他事情
r
前缀创建一个原始字符串(例如,r'\t'
是反斜杠+t
而不是制表符),以及三个引号允许多行字符串文本。下面是一个示例,在Python 3.x中,如果缺少b
,将引发类型错误
异常
>>> 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
>f=open(“新建”、“wb”)
>>>f.write(“你好,Python!”)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:“str”不支持缓冲区接口
添加
b
前缀可以解决问题。除了其他人所说的之外,请注意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
从服务器端,如果我们发送任何响应,它将以字节类型的形式发送,因此它将在客户端显示为
b'response From server'
为了摆脱b'..'
只需使用以下代码:
服务器文件:
stri="Response from server"
c.send(stri.encode())
客户端文件:
print(s.recv(1024).decode())
然后它将打印来自服务器的响应
print(s.recv(1024).decode())
import json
data = b'{"key":"value"}'
print(json.loads(data))
import requests
requests.post(url='http://localhost(example)/',json={'key':'value'})
@app.route('/', methods=['POST'])
def api_script_add():
print(request.data) # --> b'{"hi":"Hello"}'
print(json.loads(request.data))
return json.loads(request.data)
data.encode()
data.decode()