HTML 字元編碼
在瀏覽器裡轉義 HTML 特殊字元,可以選擇只轉 HTML 必需的最小集合,或全部數值化。
在你的瀏覽器中執行
第一個幾乎永遠是對的。最後一個會把中文內容膨脹好幾倍,只有舊系統才需要。
還沒有東西可以轉換。
真正重要的只有五個字元,其餘都是偏好
只有五個字元會改變瀏覽器解析 HTML 的方式:&、<、>、" 和 '。把這五個轉義掉,就是
「讓文字不會被當成標記讀取」的全部,也是這個操作中唯一跟安全有關的部分。
其他所有東西——©、—、£、中文、emoji——在一份 UTF-8 文件裡都只是普通文字,完全不需要
轉義。所以**「只轉 HTML 必須轉的」幾乎永遠是對的**,它也是預設值。
另外兩個選項有其真實但狹窄的用途:
- 有名稱的就用名稱會產生
©和—,有些人偏好在原始碼裡看到這種寫法。 - 所有非 ASCII 字元會把每一個重音字母與中日韓字元都數值化。一頁中文會膨脹到大約六倍長。 只有在某個系統真的完全無法承載 UTF-8 時才用它——而那種情況比以前少得多了。
順序有意義,這就是 & 要先轉的原因
& 必須第一個被轉義。如果它排在最後,< 會先變成 <,接著那個 & 又會被轉一次變成
&lt;,顯示出來就是字面上的 < 而不是一個小於符號。
轉義不是冪等的,也不該是。跑兩次本來就會得到不同的結果——這正是為什麼你應該在輸出的那一刻 轉義一次,而不是把轉義過的文字存進資料庫。
解碼三種寫法都吃
、  和   是同一個字元的三種寫法,解碼器三種都接受,也包括舊標記裡會
出現的大寫 &#X 變體。
任何它不認得的東西都會原封不動留著。R&D 還是 R&D,不會被弄亂,因為一個後面沒有接合法
實體的 &,就只是一個 & 而已。
有兩種情況是刻意拒絕的:指向單一代理碼位的escape(�),以及超出 Unicode 範圍的escape。
兩者都不是字元,硬要生出一個只會讓輸出壞掉。
這不是消毒
轉義讓文字可以安全地顯示,但不會讓不受信任的 HTML 可以安全地嵌入——那需要一個懂得 標籤與屬性的消毒工具。如果你要把使用者送出的標記貼進頁面裡,這不是你要的工具。
沒有任何上傳
全部都在這個頁面裡執行。