使用Python/Django从字符串中删除非ASCII字符

18

我在数据库中存储了一段HTML字符串。不幸的是,它包含像®这样的特殊字符。我想要将这些字符替换为它们对应的HTML实体,可以在数据库本身或使用Python / Django代码中的查找替换功能实现。

你有任何关于如何实现这个目标的建议吗?


3
为什么你想要替换它们?如果你的 Unicode 正确,它们应该可以在页面上正常显示。无论做什么,都不要将 HTML 编码的数据放入数据库中。 - bobince
+1 给 bobince:你确定要替换它们吗?你只需要通过添加一个元标签来告诉浏览器你正在使用 Unicode,例如 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> - Will Hardy
6个回答

23
你可以利用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 过滤器来实现。

1
据我所知,Django的转义过滤器不会转义Unicode字符,它只会转义这些字符:< > " ' & - Zack

7

这个问题的简单答案在这里:https://dev59.com/G2oy5IYBdhLWcg3wPLn0#18430817

要从字符串中删除非ASCII字符,可以使用以下命令:s = s.encode('ascii',errors='ignore')

然后将其从字节转换回字符串使用以下命令:s = s.decode()

以上均在Python 3.6中实现。


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'

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)

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


1

为了摆脱特殊的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

2
Django不会自动转义Unicode字符,它只会转义这些字符:< > " ' & - Zack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接