- ru
- Language: en
- Documentation version: latest
Конвертация между байтами и строками
Избежать работы с байтами нельзя. Например, при работе с сетью или файловой системой, чаще всего, результат возвращается в байтах.
Соответственно, надо знать, как выполнять преобразование байтов в строку и наоборот. Для этого и нужна кодировка.
Кодировку можно представлять как ключ шифрования, который указывает:
как “зашифровать” строку в байты (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]: 'привет'
Как работать с Юникодом и байтами
Есть очень простое правило, придерживаясь которого, можно избежать, как минимум, части проблем. Оно называется “Юникод-сэндвич”:
байты, которые программа считывает, надо как можно раньше преобразовать в Юникод (строку)
внутри программы работать с Юникод
Юникод надо преобразовать в байты как можно позже, перед передачей