Как считать вход Unicode и сравнить строки Unicode в Python?

Чтобы выбрать все записи, связанные с заказом, непосредственно из таблицы закупок:

SELECT * FROM purchasedProductsTable WHERE orderId = 1;

Чтобы выбрать все записи, связанные с заказом, путем присоединения к таблице заказов:

[ 111]

Если вам нужен только порядок 1 & amp; 4:

SELECT * FROM orderTable OT JOIN purchasedProductsTable PT ON (PT.orderId = OT.id) WHERE OT.id IN (1,4);

Порядок сначала по самой старой дате заказа:

SELECT * FROM orderTable OT JOIN purchasedProductsTable PT ON (PT.orderId = OT.id) ORDER BY OT.order_date DESC;

Вот SQL Fiddle для демонстрации [ 114].

30
задан Ronan Boiteau 5 February 2019 в 11:30
поделиться

4 ответа

raw_input() возвраты представляет в виде строки, как закодировано средствами UI или ОС. Трудность знает, который является тем декодированием. Вы могли бы делать попытку следующего:

import sys, locale
text= raw_input().decode(sys.stdin.encoding or locale.getpreferredencoding(True))

, который должен работать правильно в большинстве случаев.

Нам нужно больше данных о не рабочие сравнения Unicode для помощи Вам. Однако это мог бы быть вопрос нормализации. Рассмотрите следующее:

>>> a1= u'\xeatre'
>>> a2= u'e\u0302tre'

a1 и a2 эквивалентны, но не равны:

>>> print a1, a2
être être
>>> print a1 == a2
False

, Таким образом, Вы могли бы хотеть использовать unicodedata.normalize() метод:

>>> import unicodedata as ud
>>> ud.normalize('NFC', a1)
u'\xeatre'
>>> ud.normalize('NFC', a2)
u'\xeatre'
>>> ud.normalize('NFC', a1) == ud.normalize('NFC', a2)
True

, Если Вы даете нам больше информации, мы могли бы быть в состоянии помочь Вам больше, все же.

54
ответ дан jesterjunk 27 November 2019 в 23:23
поделиться

Это должно работать. raw_input возвраты строка байтов, которая необходимо декодировать использование корректного кодирования для получения Вашего unicode объект. Например, следующие работы для меня в соответствии с Python 2.5 / Terminal.app / OSX:

>>> bytes = raw_input()
日本語 Ελληνικά
>>> bytes
'\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e \xce\x95\xce\xbb\xce\xbb\xce\xb7\xce\xbd\xce\xb9\xce\xba\xce\xac'

>>> uni = bytes.decode('utf-8') # substitute the encoding of your terminal if it's not utf-8
>>> uni
u'\u65e5\u672c\u8a9e \u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac'

>>> print uni
日本語 Ελληνικά

Что касается сравнения unicode строки: можно ли отправить пример, где сравнение не работает?

16
ответ дан dF. 27 November 2019 в 23:23
поделиться

Я не действительно уверен, какой формат Вы подразумеваете "под форматом Unicode", существуют несколько. UTF-8? UTF-16? В любом случае необходимо смочь считать нормальную строку с raw_input и затем декодировать ее с помощью строк decode метод:

raw = raw_input("Please input some funny characters: ")
decoded = raw.decode("utf-8")

, Если у Вас есть другой вход, кодирующий просто, используют "utf-16" или безотносительно вместо "utf-8". Также см. документы модулей кодеков для различных видов кодировки.

Сравнение затем должно работать просто великолепно с ==. Если у Вас есть строковые литералы, содержащие специальные символы, необходимо снабдить префиксом их "u" для маркировки их как unicode:

if decoded == u"äöü":
  print "Do you speak German?"

И если Вы хотите произвести эти строки снова, Вы, вероятно, хотите закодировать их снова в желаемом кодировании:

print decoded.encode("utf-8")
4
ответ дан sth 27 November 2019 в 23:23
поделиться

В общем случае, вероятно, не возможно сравнить строки unicode. Проблема состоит в том, что существует несколько способов составить те же символы. Простой пример акцентируется римские символы. Хотя существуют кодовые точки для в основном всех наиболее часто используемых символов с диакритикой, это также корректно для создания их из безударных основных букв и диакритического знака без интервалов. Эта проблема является более значительной во многих нероманских алфавитах.

1
ответ дан TokenMacGuy 27 November 2019 в 23:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: