Подтвердить что ты не робот

Удаление символов, отличных от ASCII, из строки с использованием python/django

У меня есть строка HTML, хранящаяся в базе данных. К сожалению, он содержит такие символы, как ® Я хочу заменить эти символы своим эквивалентом HTML, либо в самой БД, либо с помощью Find Replace в моем коде Python/Django.

Любые предложения о том, как я могу это сделать?

4b9b3361

Ответ 1

Вы можете использовать, что символы ASCII являются первыми 128, поэтому получите номер каждого символа с помощью ord и разделите его, если он выходит за пределы диапазона

# -*- coding: utf-8 -*-

def strip_non_ascii(string):
    ''' Returns the string without non ASCII characters'''
    stripped = (c for c in string if 0 < ord(c) < 127)
    return ''.join(stripped)


test = u'éáé123456tgreáé@€'
print test
print strip_non_ascii(test)

Результат

éáé123456tgreáé@€
[email protected]

Обратите внимание, что @ включен, потому что, ну, в конце концов, это символ ASCII. Если вы хотите разбить конкретное подмножество (например, просто цифры и прописные и строчные буквы), вы можете ограничить диапазон, смотря на таблицу ASCII

EDITED: после повторного чтения вашего вопроса, возможно, вам нужно избежать вашего HTML-кода, поэтому все эти символы отображаются правильно после отображения. Вы можете использовать фильтр escape на ваших шаблонах.

Ответ 2

Я нашел это некоторое время назад, так что это никоим образом не моя работа. Я не могу найти источник, но здесь фрагмент кода.

def unicode_escape(unistr):
    """
    Tidys up unicode entities into HTML friendly entities

    Takes a unicode string as an argument

    Returns a unicode string
    """
    import htmlentitydefs
    escaped = ""

    for char in unistr:
        if ord(char) in htmlentitydefs.codepoint2name:
            name = htmlentitydefs.codepoint2name.get(ord(char))
            entity = htmlentitydefs.name2codepoint.get(name)
            escaped +="&#" + str(entity)

        else:
            escaped += char

    return escaped

Используйте его так:

>>> from zack.utilities import unicode_escape
>>> unicode_escape(u'such as ® I want')
u'such as &#174 I want'

Ответ 3

Этот фрагмент кода может вам помочь.

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

def removeNonAscii(string):
    nonascii = bytearray(range(0x80, 0x100))
    return string.translate(None, nonascii)

nonascii_removed_string = removeNonAscii(string_to_remove_nonascii)

Определение кодирования очень важно здесь, которое выполняется во второй строке.

Ответ 4

Чтобы избавиться от специального xml, html-символов '<', ' > ', '&' вы можете использовать cgi.escape:

import cgi
test = "1 < 4 & 4 > 1"
cgi.escape(test)

Вернется:

'1 &lt; 4 &amp; 4 &gt; 1'

Это, вероятно, минимальный минимум, который вам нужно, чтобы избежать проблем. Для более того вы должны знать кодировку вашей строки. Если он соответствует кодировке вашего html-документа, вам не нужно делать что-то еще. Если нет, вам нужно преобразовать в правильную кодировку.

test = test.decode("cp1252").encode("utf8")

Предположим, что ваша строка была cp1252 и что ваш html-документ - utf8

Ответ 6

Там гораздо проще ответить на fooobar.com/info/40598/...

Чтобы удалить не-ASCII-символы из строки, s, используйте:

s = s.encode('ascii',errors='ignore')

Затем преобразуйте его из байтов в строку, используя:

s = s.decode()

Все это с использованием Python 3.6