[python] ‘b’문자는 문자열 리터럴 앞에서 무엇을합니까?

다음은 유효한 구문입니다.

my_string = b'The string'

나는 알고 싶다:

  1. b줄 앞 의이 문자는 무엇을 의미합니까?
  2. 그것을 사용하면 어떤 효과가 있습니까?
  3. 그것을 사용하기에 적절한 상황은 무엇입니까?

여기에서 관련 질문을 찾았 지만 PHP에 관한 질문이며 bPHP <6 버전과 호환되는 코드에 필요한 유니 코드와 달리 문자열이 바이너리임을 나타내는 데 사용됩니다 PHP 6으로 마이그레이션 할 때 이것이 파이썬에 적용되지 않는다고 생각합니다.

파이썬 사이트 에서 동일한 구문 의 문자를 사용하여 문자열을 유니 코드로 지정하는 방법에 대한 이 설명서 를 찾았습니다 u. 불행히도, 이 문서의 어느 곳에서나 b 문자 는 언급하지 않습니다 .

또한, 단지 호기심의보다 더 많은 문자가 있습니다 bu다른 일을?



답변

Python 2.x 설명서 를 인용하려면 :

파이썬 2에서는 접두사 ‘b’또는 ‘B’가 무시됩니다. 이는 리터럴이 파이썬 3에서 바이트 리터럴이되어야 함을 나타냅니다 (예 : 코드가 2to3으로 자동 변환 될 때). ‘u’또는 ‘b’접두어 뒤에 ‘r’접 두부가 올 수 있습니다.

파이썬 3 문서 상태 :

바이트 리터럴은 항상 ‘b’또는 ‘B’로 시작합니다. str 유형 대신 bytes 유형의 인스턴스를 생성합니다. ASCII 문자 만 포함 할 수 있습니다. 128 이상의 숫자 값을 가진 바이트는 이스케이프로 표현해야합니다.


답변

파이썬 3.x 는 타입을 명확하게 구분합니다 :

  • str= '...'리터럴 = 일련의 유니 코드 문자 (UTF-16 또는 UTF-32, Python 컴파일 방식에 따라 다름)
  • bytes= b'...'리터럴 = 일련의 8 진수 (0에서 255 사이의 정수)

자바 나 C #을 나왔습니다에 익숙한 당신이 경우, 생각 strStringbytes같은 byte[]. 당신은 SQL에 익숙하다면, 생각 strNVARCHARbytes같은 BINARYBLOB. 당신이 Windows 레지스트리에 익숙하다면, 생각 strREG_SZbytes같은 REG_BINARY. C (++)에 익숙하다면 char, CHARACTER는 BYTE가 아니기 때문에 배운 모든 것과 문자열 을 잊어 버리십시오 . 그 아이디어는 오래 쓸모가 없습니다.

str텍스트를 나타내려고 할 때 사용 합니다.

print('שלום עולם')

bytes구조체와 같은 하위 수준 이진 데이터를 나타내려고 할 때 사용 합니다.

NaN = struct.unpack('>d', b'\xff\xf8\x00\x00\x00\x00\x00\x00')[0]

a 를 객체로 인코딩 할 수 있습니다 .strbytes

>>> '\uFEFF'.encode('UTF-8')
b'\xef\xbb\xbf'

그리고를 a bytes로 디코딩 할 수 있습니다 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

b'...'표기법은 바이트 0x01-0x7F를 16 진수 대신 ASCII 문자로 지정할 수 있다는 점에서 다소 혼란 스럽습니다.

>>> b'A' == b'\x41'
True

그러나 나는 문자가 바이트가 아니라는 것을 강조해야합니다 .

>>> 'A' == b'A'
False

Python 2.x에서

3.0 이전 버전의 Python에서는 텍스트와 이진 데이터 간의 구분이 부족했습니다. 대신에

  • unicode= u'...'리터럴 = 유니 코드 문자 시퀀스 = 3.xstr
  • str= '...'리터럴 = 혼란스러운 바이트 / 문자 시퀀스
    • 일반적으로 일부 지정되지 않은 인코딩으로 인코딩 된 텍스트입니다.
    • 그러나 struct.pack출력 과 같은 이진 데이터를 나타내는 데에도 사용됩니다 .

2.x에서 -3.x 로의 전환을 용이하게하기 위해 b'...'리터럴 구문은 이진 문자열 ( bytes3.x에 있어야 함 )과 텍스트 문자열 ( str3에 있어야 함)을 구별 할 수 있도록 Python 2.6으로 백 포트되었습니다. .엑스). b접두사는 2.X에서 아무것도하지 않는다,하지만 알 2to33.x에서의 유니 코드 문자열로 변환하지 스크립트를

예, b'...'파이썬의 리터럴은 PHP에서와 같은 목적을 가지고 있습니다.

또한 호기심에서 다른 일을하는 b와 u보다 더 많은 상징이 있습니까?

r접두사 (예, 원시 문자열을 생성 r'\t'백 슬래시 +입니다 t대신 탭), 트리플 따옴표 '''...'''또는 """..."""여러 줄 문자열 리터럴을 할 수 있습니다.


답변

b는 바이트 문자열을 나타냅니다.

바이트는 실제 데이터입니다. 문자열은 추상화입니다.

다중 문자 문자열 객체가 있고 단일 문자를 사용하는 경우 문자열이되며 인코딩에 따라 크기가 1 바이트를 초과 할 수 있습니다.

바이트 문자열과 함께 1 바이트를 사용하면 0-255에서 단일 8 비트 값을 얻을 수 있으며 인코딩으로 인해 해당 문자가 1 바이트보다 크면 완전한 문자를 나타내지 않을 수 있습니다.

TBH 바이트를 사용해야하는 특정 저수준 이유가 없으면 문자열을 사용합니다.


답변

서버 측에서 응답을 보내면 바이트 유형의 형태로 전송되므로 클라이언트에 다음과 같이 나타납니다. b'Response from server'

b'....'아래 코드를 사용 하여 간단히 제거하십시오 .

서버 파일 :

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

클라이언트 파일 :

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

그런 다음 인쇄됩니다 Response from server


답변

다음 은 Python 3.x에서 예외 bTypeError발생 하지 않는 예입니다.

>>> 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접두사를 추가 하면 문제가 해결됩니다.


답변

그것은로 변 bytes문자 (또는 str2.X에서) 및 2.6+ 유효하다.

r접두사는 백 슬래시는 “해석되지”되도록 (무시하지, 그 차이는 않습니다 문제).


답변

다른 사람들이 말한 것 외에도 유니 코드의 단일 문자 는 여러 바이트로 구성 될 수 있습니다 .

유니 코드가 작동하는 방식은 이전 ASCII 형식 (0xxx xxxx처럼 보이는 7 비트 코드)을 취하고 모든 바이트가 1 (1xxx xxxx)로 시작하여 ASCII 이외의 문자를 나타내므로 유니 코드가 거꾸로 되도록 멀티 바이트 시퀀스를 추가 하는 것입니다 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