Книга: PyNEng
Назад: Unicode в Python 3
Дальше: Примеры конвертации

Конвертация между байтами и строками

Конвертация между байтами и строками

Избежать работы с байтами нельзя. Например, при работе с сетью или файловой системой, чаще всего, результат возвращается в байтах.

Соответственно, надо знать, как выполнять преобразование байтов в строку и наоборот. Для этого и нужна кодировка.

Кодировку можно представлять как ключ шифрования, который указывает:

  • как "зашифровать" строку в байты (str -> bytes). Используется метод encode (похож на encrypt)
  • как "расшифровать" байты в строку (bytes -> str). Используется метод decode (похож на decrypt)

Эта аналогия позволяет понять, что преобразования строка-байты и байты-строка должны использовать одинаковую кодировку.

encode, decode

Для преобразования строки в байты используется метод encode:

In [1]: hi = 'привет'  In [2]: hi.encode('utf-8') Out[2]: b'\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82'  In [3]: hi_bytes = hi.encode('utf-8') 

Чтобы получить строку из байт, используется метод decode:

In [4]: hi_bytes Out[4]: b'\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82'  In [5]: hi_bytes.decode('utf-8') Out[5]: 'привет' 

str.encode, bytes.decode

Метод encode есть также в классе str (как и другие методы работы со строками):

In [6]: hi Out[6]: 'привет'  In [7]: str.encode(hi, encoding='utf-8') Out[7]: b'\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82' 

А метод decode есть у класса bytes (как и другие методы):

In [8]: hi_bytes Out[8]: b'\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82'  In [9]: bytes.decode(hi_bytes, encoding='utf-8') Out[9]: 'привет' 

В этих методах кодировка может указываться как ключевой аргумент (примеры выше) или как позиционный:

In [10]: hi_bytes Out[10]: b'\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82'  In [11]: bytes.decode(hi_bytes, 'utf-8') Out[11]: 'привет' 

Как работать с Юникод и байтами

Есть очень простое правило, придерживаясь которого, можно избежать, как минимум, части проблем. Оно называется "Юникод сендвич":

  • байты, которые программа считывает, надо как можно раньше преобразовать в юникод (строку)
  • внутри программы работать с юникод
  • юникод надо преобразовать в байты как можно позже, перед передачей

Назад: Unicode в Python 3
Дальше: Примеры конвертации