Юникод против байтов
Сначала немного терминологии. Существует два типа строк, закодированных и декодированных:
- закодированные. Это то, что хранится на диске. Для Python это набор из 0 и 1, который вы можете рассматривать как ASCII, но это может быть что угодно - двоичные данные, изображение JPEG, что угодно. В Python 2.x это называется «строковой» переменной. В Python 3.x его более точно называют переменной «байтов».
- Раскодированный. Это строка реальных символов. Они могут быть закодированы в 8-битные строки ASCII или в 32-битные китайские символы. Но пока не пришло время конвертировать в закодированную переменную , это всего лишь строка символов Unicode.
Что это значит для вас
Так вот в чем дело. Вы сказали, что получаете одну переменную ASCII и одну переменную Unicode. На самом деле это не так.
- У вас есть одна переменная, представляющая собой строку байтов - единиц и нулей, предположительно в наборах по 8. Это переменная, которую вы ошибочно приняли за ASCII.
- У вас есть другая переменная, которая представляет собой данные Unicode - цифры, буквы и символы.
Прежде чем сравнивать строку байтов со строкой символов Юникода, необходимо сделать некоторые предположения. В вашем случае Python (и вы) предположили, что строка байтов была закодирована в ASCII. Это работало нормально, пока вы не наткнулись на персонажа, который не был ASCII - персонаж с акцентом.
Так что вам нужно выяснить, как кодируется эта строка байтов. Это может быть латынь1. Если это так, вы хотите сделать это:
if unicode_variable == string_variable.decode('latin1')
Latin1 - это в основном ASCII плюс некоторые расширенные символы, такие как Ç и В.
Если ваши данные на латыни1, это все, что вам нужно сделать. Но если ваша строка байтов кодируется во что-то еще, вам нужно выяснить, что это за кодировка, и передать ее в decode ().
Суть в том, что нет простого ответа, если вы не знаете (или не делаете некоторых предположений) о кодировании ваших входных данных.
Что бы я сделал
Попробуйте запустить var.decode ('latin1') для вашей строки байтов. Это даст вам переменную Unicode. Если это работает, и данные выглядят правильно (т. Е. Символы с символами ударения выглядят так, как будто они принадлежат), используйте их.
Да, и если latin1 не анализирует или выглядит неправильно, попробуйте utf8 - другую распространенную кодировку.