使用python / django从字符串中删除非ASCII字符

时间:2010-04-30 07:56:36

标签: python regex django unicode replace

我有一个存储在数据库中的HTML字符串。不幸的是它包含了诸如®等字符 我希望用它们的HTML等效替换这些字符,无论是在数据库本身还是在我的Python / Django代码中使用查找替换。

关于我如何做到这一点的任何建议?

6 个答案:

答案 0 :(得分:20)

您可以使用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 table

已编辑:再次阅读您的问题后,您可能需要转义HTML代码,因此所有这些字符在呈现后都会正确显示。您可以在模板上使用escape过滤器。

答案 1 :(得分:3)

我刚才发现了这一点,所以这绝不是我的工作。我找不到源代码,但这是我代码中的代码段。

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 :(得分:2)

此代码段可以为您提供帮助。

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

编码定义在这里非常重要,在第二行完成。

答案 3 :(得分:2)

https://stackoverflow.com/a/18430817/5100481

有一个更简单的答案

要从字符串s中删除非ASCII字符,请使用:

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

然后使用以下命令将其从字节转换回字符串:

s = s.decode()

这一切都使用Python 3.6

答案 4 :(得分:1)

要摆脱特殊的xml,html字符'&lt;','&gt;','&amp;'你可以使用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

答案 5 :(得分:0)

你不应该做任何事情,因为Django会自动转义字符:

请参阅:http://docs.djangoproject.com/en/dev/topics/templates/#id2