Быстрый 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.
Вы можете использовать эту 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'
Взгляните на это: ftp://alan.smcvt.edu/hefferon/unicode2ascii.py
Возможно, не завершено, но может помочь вам начать.
Универсальным решением (особенно для нормализации поиска и генерации слогов) является модуль 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()
Это заменит все неалфавитно-цифровые символы фиктивной заменой, а затем транслитерирует строку и переведет ее в нижний регистр.
Что насчет этого:
normalize('NFKD', unicode_string).encode('ASCII', 'ignore').lower()
Взято отсюда (испанский) http://python.org.ar/pyar/Recetario/NormalizarCaracteresUnicode