JS轉(zhuǎn)換轉(zhuǎn)義字符

這周在開發(fā)后端系統(tǒng)的時(shí)候,遇到了需要將后端傳過來的轉(zhuǎn)義字符進(jìn)行轉(zhuǎn)義然后再渲染到html中,因?yàn)橹耙矝]有遇到過,所以研究了研究,記錄一下。

記得上大學(xué)時(shí)候?qū)W習(xí)C語言就有提到過轉(zhuǎn)義字符,比如\n表示回車,\t表示水平制表符等等。其實(shí)所有編程語言都有轉(zhuǎn)移字符,轉(zhuǎn)移字符出現(xiàn)的原因基本上就兩點(diǎn):

  1. 使用轉(zhuǎn)義字符來表示字符集中定義的字符,比如ASCll里面的控制字符及回車換行等字符,這些字符都沒有現(xiàn)成的文字代號。所以只能用轉(zhuǎn)義字符來表示
  2. 某一些特定的字符在編輯語言中被定義為特殊用途的字符。這些字符由于被定義為特殊用途,它們失去了原有的意義。例如在html中,<被HTML定義為標(biāo)簽的開始,所以當(dāng)我們轉(zhuǎn)入<時(shí),HTML就會(huì)把它當(dāng)作為開始,而不是當(dāng)作一個(gè)<來看待

由于不同的語言關(guān)鍵字不同,例如在一般的編程語言中,"會(huì)被當(dāng)作代碼的一部分,但是在html中它會(huì)被直接渲染,再如常見的編程語言中\n表示回車,但是在html中<br>表示回車

這就導(dǎo)致了如果后端返回的是想要在前端展示的一段代碼,則必然會(huì)包含轉(zhuǎn)移字符,而這些轉(zhuǎn)義字符html是無法識別的

解決——js轉(zhuǎn)換轉(zhuǎn)義字符

由于html與js所用的轉(zhuǎn)義字符不同所以導(dǎo)致了無法正常渲染,所以需要在js中先將轉(zhuǎn)義字符轉(zhuǎn)換,然后在渲染到html中,在js中轉(zhuǎn)換轉(zhuǎn)義字符常用的有兩種方法:

  • eval()
  • JSON.parse()

eval()函數(shù)會(huì)將傳入的字符串當(dāng)做JavaScript代碼進(jìn)行執(zhí)行。這個(gè)函數(shù)一般是不推薦使用的,因?yàn)樗麍?zhí)行的代碼擁有著執(zhí)行者的權(quán)利。如果用eval()運(yùn)行的字符串代碼被惡意方操控修改,可能會(huì)利用最終在用戶機(jī)器上運(yùn)行惡意方部署的惡意代碼,并導(dǎo)致失去對網(wǎng)頁或者擴(kuò)展程序的權(quán)限。所以這種方法是不推薦的

JSON.parse()方法用來解析JSON字符串,構(gòu)造由字符串描述的JavaScript值或?qū)ο?,?jīng)過這個(gè)轉(zhuǎn)換,由于代碼的執(zhí)行,轉(zhuǎn)義字符會(huì)被自動(dòng)轉(zhuǎn)義,從而拿到我們想要的效果,但是使用這個(gè)方法解析的時(shí)候需要注意一點(diǎn):必須組合成JSON字符串,所以我們需要將拿到的數(shù)據(jù)進(jìn)行包裝:

decodeValueFun(value) {
    const decodeValue = JSON.parse(`{"key":${value}}`);
    return decodeValue.key;
},

這樣返回的數(shù)據(jù)就是經(jīng)過轉(zhuǎn)義的數(shù)據(jù)了

疑問???

在實(shí)際測試的時(shí)候發(fā)現(xiàn),如果將后端返回的數(shù)據(jù)直接貼入前端js代碼中然后去直接展示到頁面中,轉(zhuǎn)義字符會(huì)被自動(dòng)識別,但是如果將后端返回的字符串直接渲染到html頁面中,則字符串中的轉(zhuǎn)義字符直接被當(dāng)作字符串處理,這說明在js使用字符串的時(shí)候已經(jīng)將轉(zhuǎn)義符自動(dòng)轉(zhuǎn)義,不知道這個(gè)是什么原因。

附:

常見的HTML轉(zhuǎn)義字符

字符 十進(jìn)制 轉(zhuǎn)義字符
" &#34; &quot;
& &#38; &amp;
< &#60; &lt;
> &#62; &gt;
不斷開空格(non-breaking space) &#160; &nbsp;

更多html轉(zhuǎn)義字符見鏈接:http://tool.oschina.net/commons?type=2

常見的編程語言的字符表

轉(zhuǎn)義字符 意義 ASCII碼值(十進(jìn)制)
\a 響鈴(BEL) 007
\b 退格(BS) ,將當(dāng)前位置移到前一列 008
\f 換頁(FF),將當(dāng)前位置移到下頁開頭 012
\n 換行(LF) ,將當(dāng)前位置移到下一行開頭 010
\r 回車(CR) ,將當(dāng)前位置移到本行開頭 013
\t 水平制表(HT) (跳到下一個(gè)TAB位置) 009
\v 垂直制表(VT) 011
\\ 代表一個(gè)反斜線字符''' 092
\' 代表一個(gè)單引號(撇號)字符 039
\" 代表一個(gè)雙引號字符 034
\? 代表一個(gè)問號 063
\0 空字符(NULL) 000
\ooo 1到3位八進(jìn)制數(shù)所代表的任意字符 三位八進(jìn)制
\xff 1到2位十六進(jìn)制所代表的任意字符 二位十六進(jìn)制
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,673評論 18 399
  • 上午我把我所有的現(xiàn)金,銀行卡,都翻出來,算了算要治我這病還差五千塊。 我琢磨著這五千塊找誰要去。家里不指望了,自從...
    寫意小生閱讀 355評論 0 0
  • 我做了一個(gè)可怕的夢。夢里,你病了,卻還是逞強(qiáng)對我說,只是小毛病,叫我不要擔(dān)心。 我怎么可能不擔(dān)心?20年來,你一直...
    隔三兒差五起高調(diào)閱讀 605評論 1 0
  • 有時(shí)候經(jīng)常會(huì)談起過去的某段時(shí)光,為什么老是回憶呢?因?yàn)槟嵌位貞浭且粋€(gè)電影代表,是是人生的一個(gè)重要轉(zhuǎn)折。
    大果果ly閱讀 241評論 0 0

友情鏈接更多精彩內(nèi)容