0

Для определения кодировки данных в bytes пользовался функцией chardet:

result_code = chardet.detect(data)
original_text = data.decode(result_code['encoding'])

Но когда переменная data - строка (string), выходит ошибка

TypeError: Expected object of type bytes or bytearray, got: <class 'str'>

Т.е. нужна либо другая функция для string, либо string нужно превратить в bytes. Подскажите пожалуйста, как это сделать?

1 Answers1

2

Ошибка указывает, что у вас Питон 3, где str тип, используется для текста — каждая строка (str) это последовательность символов (Unicode codepoints).

Сами символы никакой кодировки не имеют (как внутри интерпретатора строки представлены не имеет значения, до тех пор пока абстракция не нарушена).

Любая кодировка, которая может представить все символы в строке, может быть использована:

>>> "мир".encode('utf-8')
b'\xd0\xbc\xd0\xb8\xd1\x80'
>>> "мир".encode('cp1251')
b'\xec\xe8\xf0'
>>> "мир".encode('cp866')
b'\xac\xa8\xe0'
>>> "мир".encode('koi8-r')
b'\xcd\xc9\xd2'

Сама строка никакой кодировки не имеет. Ещё примеры: Как работать с путями c русскими символами?

Вопрос, который можно для строки задать: на каком языке вероятно текст написан? Или более узкий (определённый) вопрос: принадлежат ли все букву заданному диапазону в Unicode.

jfs
  • 52,361
  • Спасибо. Переформулирую вопрос: я не знаю в какой кодировке у меня текст, мне надо на лету определить кодировку, сменить ее для данного текста на utf-8 и дальше работать с текстом. Как это сделать в данном случае? Исходный текст вот такой: ІЫРбвШ єШЯаР аРббзШвлТРов ЯаШЭпвм ЯЮапФЪР – Ruslan Sagitov Oct 23 '17 at 12:42
  • 1
    @RuslanSagitov как и откуда получен исходный текст? – andreymal Oct 23 '17 at 12:45
  • Из JSON-файла.
    with open(name) as f:
          data = json.load(f)
    
    – Ruslan Sagitov Oct 23 '17 at 12:46
  • @RuslanSagitov: encoding='utf-8' добавьте. Отдельный вопрос задайте: есть json, прочитал with open(name) as f: data = json.load(f), получил ІЫРбвШ єШЯаР аРббзШвлТРов ЯаШЭпвм ЯЮапФЪР Как исправить? (и ответ скорее всего: encoding='utf-8' в open передать -- если это работает в вашем случае, опубликуйте ответ) – jfs Oct 23 '17 at 12:48
  • @jfs вручную можно и просто перебором вариантов, а надо на автомате определять – Ruslan Sagitov Oct 23 '17 at 12:48
  • @RuslanSagitov: хорошо, тогда просто задайте вопрос как я показал. И подробнее кто-нибудь ответит (почему json текст обычно в utf-8 передаётся) – jfs Oct 23 '17 at 12:50
  • @jfs Спасибо, вопрос задал. Вариант с encoding='utf-8' не сработал. – Ruslan Sagitov Oct 23 '17 at 12:54