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
    字符是什么意思
  • 使用它有什么效果
  • 使用它的适当情况是什么
  • 我在这里找到了一个,但是这个问题是关于PHP的,它指出
    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
      =
      b'…'
      literals=八位字节序列(0到255之间的整数)
    如果您熟悉:

    • Java或C#,将
      str
      看作
      String
      bytes
      看作
      byte[]
    • SQL,将
      str
      看作
      NVARCHAR
      bytes
      看作
      BINARY
      BLOB
    • Windows注册表,将
      str
      看作
      REG\u SZ
      bytes
      看作
      REG\u BINARY
    如果您熟悉C++,那么请忘记您所学到的关于
    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
      =
      u'…'
      literals=unicode字符序列=3.x
      str
    • str
      =
      '…'
      literals=混乱的字节/字符序列
      • 通常是文本,用一些未指定的编码编码
      • 但也用于表示二进制数据,如
        struct.pack
        output
    为了简化从2.x到3.x的转换,将
    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()