在 node 層利用 cheerio 解析網頁時,輸出的中文內容都是以 開頭的一堆像亂碼一樣的東西,嘗試過各種編碼都無效,而且神奇的是,將這一堆「亂碼」儲存成網頁後,通過瀏覽器開啟又可以正常顯示。這到底是什麼????
縮減後的示例**如下:
const cheerio = require(『cheerio『);
const $ = cheerio.load(『你好
『)console.log($(『#content『).html()) //你好
其實,上面那一堆亂碼一樣的東西,它的學名叫實體編碼 entity code。
下面引用下知乎搜到的答案。
在 html 中,某些字元是預留的,例如小於號「<」、大於號「>」等,瀏覽器會將它們視作標籤。如果想要在html中顯示這些預留字元,我們就要用到字元實體(character entities)。我們比較熟悉的字元實體有空格「 」,小於號「<」,大於號「>」等。這樣的格式比較語義化,容易記憶,但其實字元實體有其他的格式:
&name;
dddd;
hhhh;
這三種轉義方式都稱作 character reference,第一種是 character entity reference,「&」符號後接預先定義好的 entity 名稱。
後兩種是 numeric character reference,數字取值為目標字元的 unicode code point;以「」開頭的後接十進位制數字,「」開頭的後接十六進製制數字。
從 html4 開始,numeric character reference 以 unicode 為準,與文件編碼無關。「你好」二字分別是 unicode 字元 u+4f60 和 u+597d,十六進製制表示的 code point 數值「4f60」和「597d」,同時也就是十進位制的「20320」和「22909」。所以
在html中輸入
你好你好
都會顯示為「你好」。
知道原因後,那麼如何解決上述的問題呢?
方法一:使用cheerio提供的屬性
cheerio缺省會對entity進行decode,我們只需要關閉該功能即可
const cheerio = require(『cheerio『);
const $ = cheerio.load(『你好
『, )
console.log($(『#content『).html()) // 你好
方法二:手動decode
function decode(str) );
return str;
}
編碼通俗解釋
很久很久以前,有一群人,他們決定用8個可以開合的電晶體來組合成不同的狀態,以表示世界上的萬物。他們看到8個開關狀態是好的,於是他們把這稱為 位元組 再後來,他們又做了一些可以處理這些位元組的機器,機器開動了,可以用位元組來組合出很多狀態,狀態開始變來變去。他們看到這樣是好的,於是它們就這機器稱為 計...
onehot編碼解釋
one hot編碼,又稱為一位有效編碼,主要是採用n位狀態暫存器來對n個狀態進行編碼,每個狀態都由他獨立的暫存器位,並且在任意時候只有一位有效。one hot編碼是分類變數作為二進位制向量的表示。這首先要求將分類值對映到整數值。然後,每個整數值被表示為二進位制向量,除了整數的索引之外,它都是零值,它...
常用編碼解釋
計算機是美國人發明的,因此,最早只有127個字元被編碼到計算機裡,也就是大小寫英文本母 數字和一些符號,這個編碼表被稱為ascii編碼,比如大寫字母a的編碼是65,小寫字母z的編碼是122。但是要處理中文顯然乙個位元組是不夠的,至少需要兩個位元組,而且還不能和ascii編碼衝突,所以,中國制定了gb...