关于dddd; 这种字符编码 如何解码

        继续写爬虫ing,又踩坑里了。。。。一个网页,里面的部分中文是正面这个样子的:

已转出

看完后我的内心是近乎崩溃的。。。

        生活不易,还得继续。查了 百度,google都没有好的答案,偶然间发现了知乎上有关讲解:

http://www.zhihu.com/question/21390312

形如——
&#dddd;
&#xhhhh;
&#name;
——的一串字符是 HTML、XML 等 SGML 类语言的转义序列(escape sequence)。它们不是「编码」。

以 HTML 为例,这三种转义序列都称作 character reference:
前两种是 numeric character reference(NCR),数字取值为目标字符的 Unicode code point;以「&#」开头的后接十进制数字,以「&#x」开头的后接十六进制数字。
后一种是 character entity reference,后接预先定义的 entity 名称,而 entity 声明了自身指代的字符。
从 HTML 4 开始,NCR 以 Unicode 为准,与文档编码无关。

「中国」二字分别是 Unicode 字符 U+4E2D 和 U+56FD,十六进制表示的 code point 数值「4E2D」和「56FD」就是十进制的「20013」和「22269」。所以——
中国
中国
——这两种 NCR 写法都会在显示时转换为「中国」二字。

作者:梁海
链接:http://www.zhihu.com/question/21390312/answer/18091465
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

        说白了就是unicode编码的十进制表示,再加上一些点缀("&#"与";")。所以呢,知道了原理就好办多了。 无非就是把十进制转换为十六进制。用python写了个转换方法如下:

def ncr_to_unicode(text):
    """
    用于将北京这类NCR(numeric character reference)字符串转换为unicode串
    :param text: NCR strings such as "已转出"
    :return: unicode strings such as "\u5df2\u8f6c\u51fa"
    usage: print print unicode(ncr_to_unicode(code), 'unicode-escape')
    """
    l_text_unicode = []
    l_word = text[:-1].split(';')
    for word in l_word:
        word = word[2:]
        word_hex = hex(int(word))
        word_uni = '\u' + word_hex[2:]
        l_text_unicode.append(word_uni)
    return ''.join(l_text_unicode)

 

转载于:https://my.oschina.net/u/2269890/blog/674973

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值