Это анонимная функция самозапускания.
Проверьте объяснение W3Schools функции самозапускания .
Выражения функции может быть сделано «самозапускающимся».
Самозависающее выражение вызывается автоматически (автоматически) без вызова.
Выражения функций будут выполняться автоматически, если за выражением следует ().
Вы не можете самостоятельно вызывать объявление функции.
UTF-8 - кодировка юникода, которая использует более одного байта для специальных символов. Если вам не нужна длина закодированной строки, просто декодируйте ее и используйте len()
на объекте unicode
(а не на объекте str
!).
Вот несколько примеров:
>>> # creates a str literal (with utf-8 encoding, if this was
>>> # specified on the beginning of the file):
>>> len('ë́aúlt')
9
>>> # creates a unicode literal (you should generally use this
>>> # version if you are dealing with special characters):
>>> len(u'ë́aúlt')
6
>>> # the same str literal (written in an encoded notation):
>>> len('\xc3\xab\xcc\x81a\xc3\xbalt')
9
>>> # you can convert any str to an unicode object by decoding() it:
>>> len('\xc3\xab\xcc\x81a\xc3\xbalt'.decode('utf-8'))
6
Конечно, вы также можете получить доступ к одиночным символам в объекте unicode
, как если бы вы делали в объекте str
(они оба наследуются от basestring
и, следовательно, имеют те же методы ):
>>> test = u'ë́aúlt'
>>> print test[0]
ë
Если вы разрабатываете локализованные приложения, обычно рекомендуется использовать только unicode
-объекты внутри, путем декодирования всех вводимых вами данных. После завершения работы вы можете снова закодировать результат как «UTF-8». Если вы придерживаетесь этого принципа, вы никогда не увидите, что ваш сервер разбился из-за каких-либо внутренних UnicodeDecodeError
s, которые вы могли бы получить иначе;)
PS: Обратите внимание, что тип данных str
и unicode
значительно изменились в Python 3. В Python 3 есть только строки unicode и строки простого байта, которые больше нельзя смешивать. Это должно помочь избежать общих ошибок при работе с Юникодом ...
С уважением, Кристоф
Проблема заключается в том, что первый ë отсчитывается дважды, или я думаю, что ë находится в положении 0 и 'находится в позиции 1.
blockquote>Да. Вот как код указывает на Unicode. В общем, вы можете попросить Python преобразовать букву и отдельную «комбинирующую» диакритическую метку, такую как U + 0301 COMBINING ACUTE ACCENT, используя нормализацию Unicode:
>>> unicodedata.normalize('NFC', u'a\u0301') u'\xe1' # single character: á
Однако в Unicode нет единого символа для «С диарезисом и острым акцентом», потому что ни один язык в мире никогда не использовал букву «ë». (Транслитерация пиньинь имеет «u с диарезисом и острым акцентом», но не «e».) Следовательно, поддержка шрифтов оставляет желать лучшего; во многих случаях это очень плохо отражается и является беспорядочным блобом в моем веб-браузере.
Чтобы определить, где «редактируемые точки» в строке кодовых точек Юникода - это сложная работа, требующая довольно многого о доменном знании языков. Это часть вопроса о «сложном текстовом макете», области, которая также включает в себя такие вопросы, как двунаправленный текст и контекстуальное шейпинг и лигатуры. Для выполнения сложного текстового макета вам понадобится библиотека, такая как Uniscribe в Windows или Pango вообще (для которой есть интерфейс Python).
Если, с другой стороны, вы просто хотите полностью игнорировать все сочетая символы при выполнении подсчета, вы можете легко избавиться от них:
def withoutcombining(s): return ''.join(c for c in s if unicodedata.combining(c)==0) >>> withoutcombining(u'ë́aúlt') '\xeba\xfalt' # ëaúlt >>> len(_) 5
Лучшее, что вы можете сделать, это использовать unicodedata.normalize()
для разложения символа, а затем отфильтровать акценты.
Не забудьте использовать unicode
и unicode литералов в вашем коде.
Вы сказали: у меня есть строка: «Я хочу получить длину манипуляции на основе позиций персонажа и так далее. Проблема в том, что первый ë подсчитывается дважды, или я полагаю, что ë находится в положении 0 и 'находится в позиции 1.
Первым шагом в работе над любой проблемой Юникода является точное определение того, что находится в ваши данные; не догадываюсь. В этом случае ваша догадка верна; это не всегда будет.
«Именно то, что находится в ваших данных»: используйте встроенную функцию repr () (для большего количества вещей помимо юникода). Полезное преимущество показа результата repr () в вашем вопросе заключается в том, что у ответчиков есть то, что у вас есть. Обратите внимание, что ваш текст отображается только в 4-х позициях вместо 5 с некоторыми браузерами / шрифтами - «e» и его диакритики, а «a» искажены вместе в одной позиции.
Вы можете использовать unicodedata .name (), чтобы рассказать вам, что каждый компонент.
Вот пример:
# coding: utf8
import unicodedata
x = u"ë́aúlt"
print(repr(x))
for c in x:
try:
name = unicodedata.name(c)
except:
name = "<no name>"
print "U+%04X" % ord(c), repr(c), name
Результаты:
u'\xeb\u0301a\xfalt'
U+00EB u'\xeb' LATIN SMALL LETTER E WITH DIAERESIS
U+0301 u'\u0301' COMBINING ACUTE ACCENT
U+0061 u'a' LATIN SMALL LETTER A
U+00FA u'\xfa' LATIN SMALL LETTER U WITH ACUTE
U+006C u'l' LATIN SMALL LETTER L
U+0074 u't' LATIN SMALL LETTER T
Теперь прочитайте @ bobince's ответ: -)
, какую версию Python вы используете? Python 3.1 не имеет этой проблемы.
>>> print(len("ë́aúlt"))
6
С уважением Djoudi
ea
отличаются от акцентов в вопросе :) – John La Rooy 11 February 2010 в 21:33