unicodeをHTML用にエスケープ


python-webkit2pngは、HTMLに日本語があると文字化けしてしまったのですが、
non-ascii文字をエスケープすれば正しく表示してくれました。


そこで、unicodeのnon-ascii文字をエスケープするコードを書いてみました。

#encoding:shift-jis
from __future__ import with_statement, division, print_function

class EscapeMap(object):
    control_chars = {
        ord(u"<") : u"lt",
        ord(u">") : u"gt",
        ord(u"&") : u"amp",
        ord(u"\"") : u"quot",
    }
    def __getitem__(self, code):
        if code in self.control_chars:
            return u"&{0};".format(self.control_chars[code])
        elif code in xrange(128): #is ascii char
            return code
        else:
            return u"&#{0};".format(code)

def escape_for_html(ss):
    """
    >>> import escape
    >>> s = u'あいうえお abcde 
>|python|
&"'
    >>> escape.escape_for_html(s)
    u'&#12354;&#12356;&#12358;&#12360;&#12362; abcde <>&"'
    """
    return ss.translate(EscapeMap())

def main():
    import doctest
    doctest.testmod()

if __name__ == "__main__":
    main()