Как я могу сравнить тип unicode с строкой в ​​python?

Я пытаюсь использовать понимание списка, которое сравнивает строковые объекты, но одна из строк – utf-8, побочный продукт json.loads. Сценарий:

us = u'MyString' # is the utf-8 string 

Первая часть моего вопроса, почему это возвращает False? :

 us.encode('utf-8') == "MyString" ## False 

Часть вторая – как я могу сравнивать в понимании списка?

 myComp = [utfString for utfString in jsonLoadsObj if utfString.encode('utf-8') == "MyString"] #wrapped to read on SO 

EDIT: Я использую Google App Engine, который использует Python 2.7

Вот более полный пример проблемы:

 #json coming from remote server: #response object looks like: {"number1":"first", "number2":"second"} data = json.loads(response) k = data.keys() I need something like: myList = [item for item in k if item=="number1"] #### I thought this would work: myList = [item for item in k if item.encode('utf-8')=="number1"] 

  • Есть ли готовый jQuery-заменитель, который я могу использовать для urllib.quote и urllib.unquote в Python 2.6.5?
  • очистить текст, принадлежащий разным языкам в python
  • ElementTree и unicode
  • TypeError: initial_value должен быть unicode или None, а не str,
  • Ошибка преобразования Unicode с использованием Python в Emacs
  • удалить unicode emoji с помощью re в python
  • Python не открывает японские имена файлов
  • Юникод в ноутбуке ipython
  • 3 Solutions collect form web for “Как я могу сравнить тип unicode с строкой в ​​python?”

    Вы должны перебирать неправильный набор данных; просто зацикливайтесь прямо над JSON-загруженным словарем, нет необходимости .keys() вызывать .keys() :

     data = json.loads(response) myList = [item for item in data if item == "number1"] 

    Вы можете использовать u"number1" чтобы избежать неявных преобразований между строк Unicode и байтов:

     data = json.loads(response) myList = [item for item in data if item == u"number1"] 

    Обе версии работают нормально :

     >>> import json >>> data = json.loads('{"number1":"first", "number2":"second"}') >>> [item for item in data if item == "number1"] [u'number1'] >>> [item for item in data if item == u"number1"] [u'number1'] 

    Обратите внимание, что в вашем первом примере us не являемся строкой UTF-8; это данные в json unicode, библиотека json уже расшифровала его для вас. С другой стороны, строка UTF-8 представляет собой байты с кодировкой последовательности. Вы можете прочитать на Unicode и Python, чтобы понять разницу:

    • Абсолютный минимум Каждый разработчик программного обеспечения Абсолютно, положительно должен знать о Unicode и наборах символов (без оправданий!) Джоэл Спольски

    • Юникод Python HOWTO

    • Прагматический Юникод от Нед Батчелдер

    На Python 2 ваше ожидание, что ваш тест вернет True , будет правильным, вы делаете что-то еще не так:

     >>> us = u'MyString' >>> us u'MyString' >>> type(us) <type 'unicode'> >>> us.encode('utf8') == 'MyString' True >>> type(us.encode('utf8')) <type 'str'> 

    Нет необходимости кодировать строки для UTF-8 для сравнения; вместо этого используйте литералы в формате unicode:

     myComp = [elem for elem in json_data if elem == u"MyString"] 

    Вы пытаетесь сравнить строку байтов ( 'MyString' ) со строкой кодовых точек Unicode ( u'MyString' ). Это сравнение «яблоки и апельсины». К сожалению, Python 2 в некоторых случаях делает вид, что это сравнение действительно, вместо того, чтобы всегда возвращать False :

     >>> u'MyString' == 'MyString' # in my opinion should be False True 

    Это зависит от вас, как разработчик / разработчик, чтобы решить, какое должно быть правильное сравнение. Вот один из возможных способов:

     a = u'MyString' b = 'MyString' a.encode('UTF-8') == b # True 

    Я рекомендую выше, а не a == b.decode('UTF-8') потому что все строки стиля u'' могут быть закодированы в байты с UTF-8, за исключением, возможно, в некоторых причудливых случаях, но не все байтовые строки могут таким образом, декодируется в Unicode.

    Но если вы решите сделать кодировку UTF-8 строк Unicode перед сравнением, это приведет к сбою для чего-то подобного в системе Windows: u'Em dashes\u2014are cool'.encode('UTF-8') == 'Em dashes\x97are cool' . Но если вы .encode('Windows-1252') это будет успешным. Вот почему это сравнение яблок и апельсинов.

    Я предполагаю, что вы используете Python 3. us.encode('utf-8') == "MyString" возвращает False потому что str.encode() возвращает объект байтов :

     In [2]: us.encode('utf-8') Out[2]: b'MyString' 

    В Python 3 строки уже Unicode , поэтому u'MyString' лишний.

    Python - лучший язык программирования в мире.