Web 相關(guān)編碼和轉(zhuǎn)義

常用編碼

  • URL 編碼
  • HTML 編碼
  • JS 編碼

URL編碼

一般來說饭庞,URL只能使用英文字母(a-zA-Z)、數(shù)字(0-9)食拜、-_.~4個特殊字符以及所有(;,/?:@&=+$#)保留字符萄涯。

意味著如果使用了一些其他文字和特殊字符陈肛,則需要通過編碼的方式來進行表示,如:

// 使用了漢字
var url1 = 'http://www.帥.com';

另外我們知道在 URL 中傳參是通過鍵值對形式進行的楞黄,格式上是以池凄?&= 為特征標(biāo)識進行解析鬼廓,如果在鍵或者值的內(nèi)容中包含一些特殊符號肿仑,就會造成解析錯誤,如下所示:

// 鍵為漢字
var url2 = 'http://www.a.com?我=1';
// 值的內(nèi)容為特殊符號
var url3 = 'http://a.com?key=?&';

對于上面的情況如果我們要正常解析碎税,則需要進行編碼尤慰,需要用不會造成歧義的符號代替有歧義的符號。

我們可以通過使用系統(tǒng)原生實現(xiàn)的 API 來對字符進行 URL 編碼如:

encodeURI

encodeURI 是用來編碼 URI 的雷蹂,最常見的就是編碼一個 URL伟端。encodeURI 會將需要編碼的字符轉(zhuǎn)換為 UTF-8 的格式。對于保留字符(;,/?:@&=+$#)萎河,以及非轉(zhuǎn)義字符(字母數(shù)字以及 -_.!~*'())不會進行轉(zhuǎn)義荔泳。

例如之前 URL 中包含中文,我們可以使用 encodeURI:

encodeURI('http://www.帥.com'); // http://www.%E5%B8%85.com
encodeURI('http://www.a.com?我=1');// "http://www.a.com?%E6%88%91=1"

在這里虐杯,%E5%B8%85 就是 的 URL 編碼玛歌,%E6%88%91 即為 的 URL 編碼。然后由于 encodeURI 不轉(zhuǎn)義&擎椰、?=支子。所以對于 URL 參數(shù)的值是無法轉(zhuǎn)義的,如下面的例子:

// 值的內(nèi)容為特殊符號
encodeURI('http://a.com?key=?&'); // "http://a.com?key=?&"

此時我們就需要使用 encodeURIComponent 來解決达舒。

encodeURIComponent

顧名思義值朋,encodeURIComponent 是用來編碼 URI 參數(shù)的叹侄。它會跳過非轉(zhuǎn)義字符(字母數(shù)字以及-_.!~*'())。但會轉(zhuǎn)義 URL的 保留字符(;,/?:@&=+$#)昨登。通常來說我們會 encodeURI 結(jié)合 encodeURIComponent 來使用趾代,如下所示:

// "http://a.com?a=%3F%26"
encodeURI('http://a.com') + '?a=' + encodeURIComponent('?&');

其中 %3F%26 分別為 ?& 的 URL 編碼。需注意的是由于 encodeURIComponent 會編碼所有的 URL 保留字丰辣,所以不適合編碼 URL撒强,例如:

// "http%3A%2F%2Fa.com%3Fkey%3D%3F%26"
encodeURIComponent('http://a.com?key=?&');

上面的 http%3A%2F%2Fa.com%3Fkey%3D%3F%26 在地址欄會被解析為一個普通的字符串而不是 URL。

URL 解碼

有了 URL 編碼笙什,相應(yīng)的會有解碼機制飘哨。比如上面對應(yīng)的 3個 encode 的API對應(yīng)的解碼 API 如下:

HTML 編碼

在 HTML 中,某些字符是預(yù)留的琐凭,比如不能使用小于號(<)和大于號(>)芽隆,這是因為瀏覽器會誤認(rèn)為它們是標(biāo)簽。如果希望正確地顯示預(yù)留字符统屈,我們必須在 HTML 源代碼中使用字符實體(character entities)胚吁。當(dāng)然還另一個重要原因,有些字符在 ASCII 字符集中沒有定義鸿吆,因此需要使用字符實體來表示囤采,比如中文。

HTML 編碼分為:

  • HTML 十六進制編碼 &#xH;
  • HTML 十進制編碼 &#D;
  • HTML 實體編碼 &lt;

在 HTML 進制編碼中其中的數(shù)字則是對應(yīng)字符的 unicode 字符編碼惩淳。
比如單引號的 unicode 字符編碼是27蕉毯,則單引號可以被編碼為&#x27;

HTML 實體編碼

通常來說,在業(yè)務(wù)中我們用到更多的是 HTML 的實體編碼思犁。常用的 HTML 實體編碼函數(shù)如下所示:

/**
 * 轉(zhuǎn)義 HTML 特殊字符
 * @param {String} str
 */
function htmlEncode(str) {
  return String(str)
    .replace(/&/g, '&amp;')
    .replace(/"/g, '&quot;')
    .replace(/'/g, '&#39;')
    .replace(/</g, '&lt;')
    .replace(/>/g, '&gt;');
}

更完整的轉(zhuǎn)義列表見這里代虾。

Javascript 轉(zhuǎn)義

JavaScript 中有些字符有特殊用途,如果字符串中想使用這些字符原來的含義激蹲,需要使用反斜杠對這些特殊符號進行轉(zhuǎn)義棉磨。我們稱之為 Javascript編碼。一般有以下幾類:

  • 三個八進制數(shù)字学辱,如果不夠個數(shù)乘瓤,前面補0,例如 “e” 編碼為“\145”
  • 兩個十六進制數(shù)字策泣,如果不夠個數(shù)衙傀,前面補0,例如 “e” 編碼為“\x65”
  • 四個十六進制數(shù)字萨咕,如果不夠個數(shù)统抬,前面補0,例如 “e” 編碼為“\u0065”
  • 對于一些控制字符,使用特殊的C類型的轉(zhuǎn)義風(fēng)格(例如\n和\r)

如下面所示聪建,雙引號用于標(biāo)注字符串钙畔,然而在字符串中帶了雙引號,就會發(fā)生歧義:

var str = "Hello"";

于是我們需要對字符串內(nèi)的雙引號進行轉(zhuǎn)義金麸,也就是加上反斜杠擎析,告訴腳本引擎要區(qū)分對待:

var str = "Hello\"";

更多閱讀

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市钱骂,隨后出現(xiàn)的幾起案子叔锐,更是在濱河造成了極大的恐慌,老刑警劉巖见秽,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異讨盒,居然都是意外死亡解取,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門返顺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來禀苦,“玉大人,你說我怎么就攤上這事遂鹊≌穹Γ” “怎么了?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵秉扑,是天一觀的道長慧邮。 經(jīng)常有香客問我,道長舟陆,這世上最難降的妖魔是什么误澳? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮秦躯,結(jié)果婚禮上忆谓,老公的妹妹穿的比我還像新娘。我一直安慰自己踱承,他們只是感情好倡缠,可當(dāng)我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著茎活,像睡著了一般昙沦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上妙色,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天桅滋,我揣著相機與錄音,去河邊找鬼。 笑死丐谋,一個胖子當(dāng)著我的面吹牛芍碧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播号俐,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼泌豆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了吏饿?” 一聲冷哼從身側(cè)響起踪危,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎猪落,沒想到半個月后贞远,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡笨忌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年蓝仲,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片官疲。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡袱结,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出途凫,到底是詐尸還是另有隱情垢夹,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布维费,位于F島的核電站果元,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏掩完。R本人自食惡果不足惜噪漾,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望且蓬。 院中可真熱鬧欣硼,春花似錦、人聲如沸恶阴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冯事。三九已至焦匈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間昵仅,已是汗流浹背缓熟。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工累魔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人够滑。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓垦写,卻偏偏與公主長得像,于是被迫代替她去往敵國和親彰触。 傳聞我的和親對象是個殘疾皇子梯投,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 前一陣做活動有一個分享文案總是分享錯誤,排除法之后發(fā)現(xiàn)是一個字符的編解碼問題况毅。好幾次遇到這種問題都是懵過去的分蓖,這次...
    lzxxx閱讀 700評論 1 1
  • ??引用類型的值(對象)是引用類型的一個實例么鹤。 ??在 ECMAscript 中,引用類型是一種數(shù)據(jù)結(jié)構(gòu)味廊,用于將數(shù)...
    霜天曉閱讀 1,059評論 0 1
  • 我是鄭小敏午磁,我是樊登讀書會漳州分會的首席書童,同時我也是兩個孩子的媽媽。 記得剛剛?cè)ッ嬖嚨臅r候,是漳州分會的會長接...
    累了誰疼惜閱讀 207評論 0 0
  • 在公眾號上看到了一句話红氯,男女之間能成為密友的,大部分總是帶著愛的咕痛。 總是不知道會遇見什么樣子的人 身邊的朋友親戚都...
    最初的最后_閱讀 241評論 0 0
  • 經(jīng)年之前痢甘,她還不知道什么是真實的世界。 不久之后茉贡,她從一場美夢中醒來塞栅,到達現(xiàn)實。
    我愛吃魚吃火鍋閱讀 156評論 0 0