Удалить не-ASCII символы из строки, используя python / django - PullRequest
16 голосов
/ 30 апреля 2010

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

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

Ответы [ 6 ]

20 голосов
/ 30 апреля 2010

Вы можете использовать, чтобы символы 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áé@€
123456tgre@

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

РЕДАКТИРОВАНИЕ: После прочтения вашего вопроса, возможно, вам нужно экранировать свой HTML-код, чтобы все эти символы правильно отображались после визуализации. Вы можете использовать фильтр escape в своих шаблонах.

3 голосов
/ 30 апреля 2010

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

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'
2 голосов
/ 12 октября 2017

Ответ на этот вопрос гораздо проще: https://stackoverflow.com/a/18430817/5100481

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

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

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

s = s.decode()

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

2 голосов
/ 19 июля 2017

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

#!/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)

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

1 голос
/ 30 апреля 2010

Чтобы избавиться от специальных символов 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

0 голосов
/ 30 апреля 2010

Вам не нужно ничего делать, поскольку Django будет автоматически экранировать символы:

см .: http://docs.djangoproject.com/en/dev/topics/templates/#id2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...