Удаление символов, отличных от ASCII, из строки с использованием python/django
У меня есть строка HTML, хранящаяся в базе данных. К сожалению, он содержит такие символы, как ®
Я хочу заменить эти символы своим эквивалентом HTML, либо в самой БД, либо с помощью Find Replace в моем коде Python/Django.
Любые предложения о том, как я могу это сделать?
Ответы
Ответ 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 ® 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 < 4 & 4 > 1'
Это, вероятно, минимальный минимум, который вам нужно, чтобы избежать проблем.
Для более того вы должны знать кодировку вашей строки.
Если он соответствует кодировке вашего html-документа, вам не нужно делать что-то еще.
Если нет, вам нужно преобразовать в правильную кодировку.
test = test.decode("cp1252").encode("utf8")
Предположим, что ваша строка была cp1252 и что ваш html-документ - utf8
Ответ 5
Вам нечего делать, так как Django автоматически удаляет символы:
см.: http://docs.djangoproject.com/en/dev/topics/templates/#id2
Ответ 6
Там гораздо проще ответить на fooobar.com/info/40598/...
Чтобы удалить не-ASCII-символы из строки, s
, используйте:
s = s.encode('ascii',errors='ignore')
Затем преобразуйте его из байтов в строку, используя:
s = s.decode()
Все это с использованием Python 3.6