起源于在 V2EX 上看到一篇文章,作者在最后附上用 Base64 编码的邮箱,虽然能够有效防止一般爬虫,但感觉不够优雅。在网上搜了一圈,发现可以把邮箱转为 HTML 字符实体 的方式达到类似目的,在网页上能够正常显示,但邮箱地址并不会直接出现在源码中。

HTML 字符实体 英文为 HTML Entities ,主要是表示预留字符和一些键盘无法输入的字符。在网上搜了一圈,发现没有能直接把字符转为 HTML 字符实体 的方法,预留字符倒是可以通过 html.unescape 来转换,但中英文字符就不行了。不过因为 HTML 使用的也是 Unicode 字符集,所以我们可以通过把英文字符转为 Unicode,然后再加上 &#; 来实现。

转换

首先是尝试把字符转为 Unicode 编码

# 使用内建函数 ord() 实现编码转换
>>> ord('w')
119

拼接

然后把转换完成的 Unicode 拼接成 HTML 字符实体,即在 Unicode 前加上 &#Unicode 后加上 ;

# 使用 join() 完成拼接
>>> ''.join('&#' + str(ord('w')) + ';')
'w'

这样,转换完成的便是 HTML 可以识别的字符实体,把它直接加进 Markdown,或者是以 HTML 的方式写入都可以。

完整代码

def character2unicode(mail):
    """转换字符为 HTML 字符实体,并返回"""
    return ''.join('&#' + str(ord(m)) + ';' for m in mail)

if __name__ == "__main__":
    print(character2unicode('me@wuze.me'))

参考