Как я заставляю str.translate работать со строками Unicode?

ELMAH очень популярен и полезен для исключения, входящего в систему приложения ASP.NET.

56
задан Daryl Spitzer 24 August 2009 в 18:52
поделиться

3 ответа

Для Unicode-версии translate требуется отображение порядковых номеров Unicode (которые вы можете получить для одного символа с помощью ord ) в порядковые номера Unicode. Если вы хотите удалить символы, вы сопоставляете их с None .

Я изменил вашу функцию, чтобы построить dict, сопоставляющий порядковый номер каждого символа с порядковым номером того, что вы хотите преобразовать:

def translate_non_alphanumerics(to_translate, translate_to=u'_'):
    not_letters_or_digits = u'!"#%\'()*+,-./:;<=>?@[\]^_`{|}~'
    translate_table = dict((ord(char), translate_to) for char in not_letters_or_digits)
    return to_translate.translate(translate_table)

>>> translate_non_alphanumerics(u'<foo>!')
u'_foo__'

edit : Оказывается, отображение перевода должно отображаться из порядкового номера Unicode (через ord ) либо в другой порядковый номер Unicode, либо в строку Unicode, либо в None (для удаления). Таким образом, я изменил значение по умолчанию для translate_to на литерал Unicode. Например:

>>> translate_non_alphanumerics(u'<foo>!', u'bad')
u'badfoobadbad'
56
ответ дан 26 November 2019 в 17:29
поделиться

Я придумал следующую комбинацию моей исходной функции и версии Майка , которая работает с Строки Unicode и ASCII:

def translate_non_alphanumerics(to_translate, translate_to=u'_'):
    not_letters_or_digits = u'!"#%\'()*+,-./:;<=>?@[\]^_`{|}~'
    if isinstance(to_translate, unicode):
        translate_table = dict((ord(char), unicode(translate_to))
                               for char in not_letters_or_digits)
    else:
        assert isinstance(to_translate, str)
        translate_table = string.maketrans(not_letters_or_digits,
                                           translate_to
                                              *len(not_letters_or_digits))
    return to_translate.translate(translate_table)

Обновление : «принудительно» translate_to к Unicode для Unicode translate_table . Спасибо, Майк.

5
ответ дан 26 November 2019 в 17:29
поделиться

Для простого взлома, который будет работать как с объектами str, так и с объектами Unicode, преобразовать таблицу преобразования в Unicode перед запуском translate ():

import string
def translate_non_alphanumerics(to_translate, translate_to='_'):
    not_letters_or_digits = u'!"#%\'()*+,-./:;<=>?@[\]^_`{|}~'
    translate_table = string.maketrans(not_letters_or_digits,
                                       translate_to
                                         *len(not_letters_or_digits))
    translate_table = translate_table.decode("latin-1")
    return to_translate.translate(translate_table)

Уловка здесь в том, что она неявно преобразует все объекты str в unicode, выдает ошибки, если to_translate содержит символы, отличные от ascii.

4
ответ дан 26 November 2019 в 17:29
поделиться
Другие вопросы по тегам:

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