специальные буквы python, fix string [duplicate]

Это анонимная функция самозапускания.

Проверьте объяснение W3Schools функции самозапускания .

Выражения функции может быть сделано «самозапускающимся».

Самозависающее выражение вызывается автоматически (автоматически) без вызова.

Выражения функций будут выполняться автоматически, если за выражением следует ().

Вы не можете самостоятельно вызывать объявление функции.

11
задан roflwaffle 11 February 2010 в 21:10
поделиться

5 ответов

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 и строки простого байта, которые больше нельзя смешивать. Это должно помочь избежать общих ошибок при работе с Юникодом ...

С уважением, Кристоф

18
ответ дан tux21b 22 August 2018 в 15:22
поделиться
  • 1
  • 2
    Я думаю, что этот ответ подчеркивает проблему - акценты на ea отличаются от акцентов в вопросе :) – John La Rooy 11 February 2010 в 21:33
  • 3
    О, ты прав. Я думаю, что потерял персонажа, копируя его ... извините за это. К сожалению, похоже, что нет единого символа юникода, который может представлять акценты. Никогда раньше такого не видел (по крайней мере, немецкие умлауты, которые я знаю, могут быть написаны в обоих направлениях, как единый и комбинированный charecter) – tux21b 11 February 2010 в 21:51

Проблема заключается в том, что первый ë отсчитывается дважды, или я думаю, что ë находится в положении 0 и 'находится в позиции 1.

Да. Вот как код указывает на 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
5
ответ дан bobince 22 August 2018 в 15:22
поделиться
  • 1
    +1 Этот ответ работает. Обратите внимание, что в разделе кода отображается неверно, но я считаю, что это только проблема шрифта / браузера. – John La Rooy 11 February 2010 в 22:18
  • 2
    Это не обобщенное решение. Вам нужен способ получить графемы, а не только кодовые точки, а преобразование в NFC просто недостаточно для общего случая. Это легко сделать в Perl, где класс Unicode :: GCString поддерживает базовые операции, такие как substr (), index () и т. П., Что все работает над графемами. Тогда объединение символов не имеет значения, и все это работает правильно. Тем не менее, Python, насколько мне известно, не имеет такого модуля. – tchrist 10 January 2013 в 02:53

Лучшее, что вы можете сделать, это использовать unicodedata.normalize() для разложения символа, а затем отфильтровать акценты.

Не забудьте использовать unicode и unicode литералов в вашем коде.

1
ответ дан Ignacio Vazquez-Abrams 22 August 2018 в 15:22
поделиться

Вы сказали: у меня есть строка: «Я хочу получить длину манипуляции на основе позиций персонажа и так далее. Проблема в том, что первый ë подсчитывается дважды, или я полагаю, что ë находится в положении 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 ответ: -)

0
ответ дан John Machin 22 August 2018 в 15:22
поделиться

, какую версию Python вы используете? Python 3.1 не имеет этой проблемы.

>>> print(len("ë́aúlt"))
6

С уважением Djoudi

0
ответ дан user 22 August 2018 в 15:22
поделиться
Другие вопросы по тегам:

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