Char и байты в питоне - PullRequest
       25

Char и байты в питоне

0 голосов
/ 09 октября 2019

При чтении этого урока я столкнулся со следующей разницей между __unicode__ и __str__ методом:

Из-за этой разницы вмикс для управления преобразованием строк в Python 2: __unicode__. В Python 2 __str__ возвращает байты, тогда как __unicode__ возвращает символы.

Как именно здесь определяются «символ» и «байт»? Например, в C символ - это один байт, поэтому не будет ли символ = байт? Или это относится к (потенциально) символам Юникода, которые могут быть несколькими байтами? Например, если мы взяли следующее:

Ω (omega symbol)
03 A9 or u'\u03a9'

В python это будет считаться одним символом (Ω) и двумя байтами или двумя символами (03 A9) и двумя байтами? Или, может быть, я путаю разницу между char и character?

1 Ответ

2 голосов
/ 09 октября 2019

В Python u'\u03a9' - это строка, состоящая из одного символа Unicode Ω (U + 03A9). Внутреннее представление этой строки является деталью реализации, поэтому нет смысла спрашивать о задействованных байтах.

Одним из источников неоднозначности является строка типа 'é', которая может быть либо один символ U + 00E9 или двухсимвольная строка U + 0065 U + 0301.

>>> len(u'\u00e9'); print(u'\u00e9')
1
é
>>> len(u'\u0065\u0301'); print(u'\u0065\u0301')
2
é

Однако двухбайтовая последовательность '\xce\xa9' может интерпретироваться как UTF-8кодирование U + 03A9.

>>> u'\u03a9'.encode('utf-8')
'\xce\xa9'

>>> '\xce\xa9'.decode('utf-8')
u'\u03a9'

В Python 3 это будет (с UTF-8 в качестве схемы кодирования по умолчанию)

>>> '\u03a9'.encode()
b'\xce\xa9'
>>> b'\xce\xa9'.decode()
'Ω'

Другие последовательности байтов могут быть декодированы в U+ 03A9:

>>> b'\xff\xfe\xa9\x03'.decode('utf16')
'Ω'
>>> b'\xff\xfe\x00\x00\xa9\x03\x00\x00'.decode('utf32')
'Ω'
...