Как реализовать сопоставление строк Unicode путем сворачивания в Python

Быстрый grep libstd++ кодовая база показал следующие два использования __gx_personality_v0:

В libsupc ++/unwind-cxx.h

// GNU C++ personality routine, Version 0.                                      
extern "C" _Unwind_Reason_Code __gxx_personality_v0
     (int, _Unwind_Action, _Unwind_Exception_Class,
      struct _Unwind_Exception *, struct _Unwind_Context *);

В libsupc ++/eh_personality.cc

#define PERSONALITY_FUNCTION    __gxx_personality_v0
extern "C" _Unwind_Reason_Code
PERSONALITY_FUNCTION (int version,
                      _Unwind_Action actions,
                      _Unwind_Exception_Class exception_class,
                      struct _Unwind_Exception *ue_header,
                      struct _Unwind_Context *context)
{
  // ... code to handle exceptions and stuff ...
}

(Примечание: это на самом деле немного более сложно, чем это; существует некоторая условная компиляция, которая может изменить некоторые детали).

Так, пока Ваш код на самом деле не использует обработку исключений, определяя символ, поскольку void* ни на что не будет влиять, но как только это делает, Вы собираетесь отказать - __gxx_personality_v0, функция, не, некоторый глобальный объект, таким образом пытаясь вызвать функцию собирается перейти, чтобы обратиться 0 и вызвать segfault.

10
задан u0b34a0f6ae 12 September 2009 в 19:25
поделиться

4 ответа

Вы можете использовать эту strip_accents функцию, чтобы удалить акценты:

def strip_accents(s):
   return ''.join((c for c in unicodedata.normalize('NFD', unicode(s)) if unicodedata.category(c) != 'Mn'))

>>> strip_accents(u'Östblocket')
'Ostblocket'
6
ответ дан 3 December 2019 в 23:50
поделиться

Взгляните на это: ftp://alan.smcvt.edu/hefferon/unicode2ascii.py

Возможно, не завершено, но может помочь вам начать.

1
ответ дан 3 December 2019 в 23:50
поделиться

Универсальным решением (особенно для нормализации поиска и генерации слогов) является модуль unidecode:

http://pypi.python.org/pypi/Unidecode

Это порт модуля Text::Unidecode для Perl. Он не полный, но переводит все латинские символы, которые я смог найти, транслитерирует кириллицу, китайский и т.д. в латиницу и даже правильно обрабатывает полноразмерные символы.

Вероятно, хорошей идеей будет просто удалить все символы, которые вы не хотите иметь в конечном выводе, или заменить их на заполнитель (например, "äßœ$" будет без кодировки переведен в "assoe$", поэтому вы можете захотеть удалить неалфавитно-цифровые символы). Для символов, которые он транслитерирует, но не должен (например, §=>SS и =>EU), необходимо очистить вход:

input_str = u'äßœ$'
input_str = u''.join([ch if ch.isalnum() else u'-' for ch in input_str])
input_str = str(unidecode(input_str)).lower()

Это заменит все неалфавитно-цифровые символы фиктивной заменой, а затем транслитерирует строку и переведет ее в нижний регистр.

1
ответ дан 3 December 2019 в 23:50
поделиться

Что насчет этого:

normalize('NFKD', unicode_string).encode('ASCII', 'ignore').lower()

Взято отсюда (испанский) http://python.org.ar/pyar/Recetario/NormalizarCaracteresUnicode

1
ответ дан 3 December 2019 в 23:50
поделиться
Другие вопросы по тегам:

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