關於&#dddd; 這種字符編碼 如何解碼

        繼續寫爬蟲ing,又踩坑裏了。。。。一個網頁,裏面的部分中文是正面這個樣子的:python

已转出

看完後個人心裏是近乎崩潰的。。。app

        生活不易,還得繼續。查了 百度,google都沒有好的答案,偶然間發現了知乎上有關講解: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寫了個轉換方法以下:code

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)
相關文章
相關標籤/搜索