我在数据库中存储了一段HTML字符串。不幸的是,它包含像®这样的特殊字符。我想要将这些字符替换为它们对应的HTML实体,可以在数据库本身或使用Python / Django代码中的查找替换功能实现。
你有任何关于如何实现这个目标的建议吗?
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 表 来限制范围。escape
过滤器来实现。< > " ' &
。 - Zack这个问题的简单答案在这里:https://dev59.com/G2oy5IYBdhLWcg3wPLn0#18430817
要从字符串中删除非ASCII字符,可以使用以下命令:s = s.encode('ascii',errors='ignore')
然后将其从字节转换回字符串使用以下命令:s = s.decode()
以上均在Python 3.6中实现。
我之前发现了这个代码片段,所以这并不是我的作品。我找不到来源,但这里是我代码中的片段。
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'
#!/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)
这里非常重要的是编码定义,它在第二行完成。
为了摆脱特殊的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")
你不需要做任何事情,因为Django会自动转义字符:
参见:http://docs.djangoproject.com/en/dev/topics/templates/#id2
< > " ' &
。 - Zack
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
。 - Will Hardy