Python3: декодировать байты UTF-8, преобразованные в строку - PullRequest
0 голосов
/ 06 июля 2018

Предположим, у меня есть что-то вроде:

a = "Gżegżółka"
a = bytes(a, 'utf-8')
a = str(a)

, который возвращает строку в форме:

b'G\xc5\xbceg\xc5\xbc\xc3\xb3\xc5\x82ka'

Теперь это отправляется как простая строка (я получаю это как утверждение из функции eval). Как, черт возьми, теперь я могу получить нормальную UTF-8 форму начального слова? Если есть какое-то лучшее сжатие, чем str(bytes(x)), тогда я был бы рад услышать.

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Я нашел это. Самый простой способ снова преобразовать строковое представление байтов в байты - использовать оператор eval:

a = "Gżegżółka"
a = bytes(a, 'utf-8')
a = str(a) #this is the input we deal with

a = eval(a) #that's how we transform a into bytes
a = str(a, 'utf-8') #...and now we convert it into string

print(a)
0 голосов
/ 06 июля 2018

Если вы хотите кодировать и декодировать текст, вот для чего нужны методы encode и decode:

>>> a = "Gżegżółka"
>>> b = a.encode('utf-8')
>>> b
b'G\xc5\xbceg\xc5\xbc\xc3\xb3\xc5\x82ka'
>>> c = b.decode('utf-8')
>>> c
'Gżegżółka'

Также обратите внимание, что UTF-8 уже используется по умолчанию, поэтому вы можете просто сделать это:

>>> b = a.encode()
>>> c = b.decode()

Единственная причина, по которой вам нужно указывать аргументы:

  • Вам нужно использовать другую кодировку вместо UTF-8,
  • Вам необходимо указать конкретный обработчик ошибок, например 'surrogatereplace' вместо 'strict' или
  • Ваш код должен работать на Python 3.0-3.1 (который почти никто не использовал).

Однако, если вы действительно хотите, вы можете делать то, что вы уже делали; вам просто нужно явно указать кодировку в вызове str, как вы это сделали в вызове bytes:

>>> a = "Gżegżółka"
>>> b = bytes(a, 'utf-8')
>>> b
b'G\xc5\xbceg\xc5\xbc\xc3\xb3\xc5\x82ka'
>>> c = str(b, 'utf-8')
>>> c

Вызов str для bytes объекта без кодировки, как вы это делали, не декодирует его и не вызывает исключение, например, вызов bytes для str без кодировки, потому что основная задача str - дать вам строковое представление объекта, а лучшее строковое представление bytes объекта - это b'…'.

...