o7412369815963
Скорее эта
>>> '\xe2\x98\x83'.encode('utf-8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 0: ordinal not in range(128)
>>>
вот пример там для второго питона показан, когда откуда-то берётся ascii
в третьем-то таких глюков нет
o7412369815963
в py3 print “принимает” только строки
o7412369815963
в py2 результат будет “обратный”
у них различается концепция:
в третьем байтовые объекты - это наборы байтов (чисел от 0-255)
>>> list(b'abc')
[97, 98, 99]
>>>
во втором байтовых объектов нет
это просто наборы однобайтовых символов (символов из latin1)
>>> list(b'abc')
['a', 'b', 'c']
>>> b'abc'[0][0][0]
'a'
>>>
в третьем, если тебе нужен print(), ты раскодируешь в юникод, а потом юникод передаёшь в print() (причём конкретно раскодируешь, а не полагаясь на интерпретатор)
те времена, когда в мире хватало однобайтовых кодировок, уже давно прошли (во времена доса)
то есть все программы переводят в юникод, потому что он однозначный для любых локализаций
а то, что второй питон может байтовые строки и юникодовые строки складывать, так это из-за того, что он их считает разными видами строк (простенькими и посложнее)
а в третьем байтовые объекты - это отдельный вид, это не строка
это набор байтов, которые и используются для прямой передачи по сети, хранения в файлах и так далее