目錄
1. HTML Entity
1. HTML Entity
1.1 介紹
在編寫HTML頁面時,需要用到"<"、">"、"空格"等符號,直接輸入這些符號時,會錯誤的把它們與標記混在一起,非常不利於編碼。
那么就需要把這些字符進行轉義,以另一種方式抒寫,以相同的形式展現。
在HTML中,這些字符可稱為HTML Entity,即HTML 字符實體。一個HTML Entity都含有2種轉義格式:Entity Name 和 Entity Number。
可參考MDN關於HTML Entity的解釋 :https://developer.mozilla.org/en-US/docs/Glossary/Entity
1.1.1 Entity Name
格式: &entityName;
說明:"&"開頭,";"結尾,以語義的形式描述字符。如字符"<",英文名稱為"less than",Entity Name為"<",取自"less than"2個單詞的首字母。
1.1.2 Entity Number
格式: &#entityNumber;
說明:"&#"開頭,";"結尾,以編號的形式描述字符。此編號可以為十進制或十六進制(以"&#x"開頭)等數字格式。
1.1.3 示例
<p>字符 :<</p> <p>Entity Name :<</p> <p>Entity Number(十進制) :<</p> <p>Entity Number(十六進制) :<</p>

可看到Entity Name、 Entity Number都在頁面顯示為"<"字符。
1.2 HTML Entity包括哪些字符呢?
包括但不限於以下字符:ASCII Characters(可見部分)、ISO 8859-1 Characters、ISO 8859-1 Symbols、Math Symbols、Greek Letters、Miscellaneous HTML entities。
在實際編碼時不是所有字符都要轉義的,比如a-z、A-Z等是沒必要轉義的。
2. 字符與Entity Name的互相轉換
Entity Name 與 字符的互相轉換只能依靠字符對照表轉換。更多字符對照表可參考:https://www.freeformatter.com/html-entities.html
2.1 ASCII 字符列表:
| Character | Entity Name | Entity Number(十進制) |
| |   | |
| ! | ! | ! |
| " | " | " |
| # | # | # |
| $ | $ | $ |
| % | % | % |
| & | & | & |
| ' | ' | ' |
| ( | ( | ( |
| ) | ) | ) |
| * | * | * |
| + | + | + |
| , | , | , |
| - | ‐ | - |
| . | . | . |
| / | / | / |
| : | : | : |
| ; | ; | ; |
| < | < | < |
| = | = | = |
| > | > | > |
| ? | ? | ? |
| @ | @ | @ |
| [ | [ | [ |
| \ | \ | \ |
| ] | ] | ] |
| ^ | ˆ | ^ |
| _ | _ | _ |
| ` | ` | ` |
| { | { | { |
| | | | | | |
| } | } | } |
| ~ | ˜ | ~ |
2.2 字符轉換為Entity Name
// ASCII字符集:char 2 entityName
var asciiChartSet_c2en = {
' ': ' ',
'!': '!',
'"': '"',
'#': '#',
'$': '$',
'%': '%',
'&': '&',
'\'': ''',
'(': '(',
')': ')',
'*': '*',
'+': '+',
',': ',',
'-': '‐',
'.': '.',
'/': '/',
':': ':',
';': ';',
'<': '<',
'=': '=',
'>': '>',
'?': '?',
'@': '@',
'[': '[',
'\\': '\',
']': ']',
'^': 'ˆ',
'_': '_',
'`': '`',
'{': '{',
'|': '|',
'}': '}',
'~': '˜'
}
// e.g. 字符轉換為Entity Name
var oldStr = '(中文)';
var newStr = oldStr.replace(/(\D{1})/g, function(matched) {
var rs = asciiChartSet_c2en[matched];
return rs == undefined ? matched : rs;
});
console.log(newStr); // => (中文)
2.3 Entity Name轉換為字符
// ASCII字符集:entityName 2 char
var asciiChartSet_en2c = {
' ': ' ',
'!': '!',
'"': '"',
'#': '#',
'$': '$',
'%': '%',
'&': '&',
''': '\'',
'(': '(',
')': ')',
'*': '*',
'+': '+',
',': ',',
'‐': '-',
'.': '.',
'/': '/',
':': ':',
';': ';',
'<': '<',
'=': '=',
'>': '>',
'?': '?',
'@': '@',
'[': '[',
'\': '\\',
']': ']',
'ˆ': '^',
'_': '_',
'`': '`',
'{': '{',
'|': '|',
'}': '}',
'˜': '~',
}
// e.g. Entity Name轉換為字符
var oldStr = '(中文)';
var newStr = oldStr.replace(/(&.+?;)/g, function(matched) {
var rs = asciiChartSet_en2c[matched];
return rs == undefined ? matched : rs;
});
console.log(newStr); // => (中文)
3. 字符與Entity Number的互相轉換
3.1 字符轉換為Entity Number
String的實例方法 charCodeAt() 可把指定字符轉換為編碼:
var charCode = '('.charCodeAt(0); // => 40
var entityNumber = '&#' + charCode + ';' // => (
3.2 Entity Number轉換為字符
String的靜態方法 fromCharCode() 可把指定編碼轉換為字符,而Entity Number的編碼可以為十進制或16進制,所以轉換時進行分別處理:
/**
* Entity Number轉換為字符
* @param {String} entityNumber entityNumber
*/
var getCharByEntityNumber = function(entityNumber) {
var num = entityNumber.replace('&#', '').replace(';', '');
if (num.indexOf('x') == 0) {
num = Number.parseInt(num, 16); // 16進制轉換為10進制
} else {
num = Number.parseInt(num); // 10進制
}
var char = String.fromCharCode(num);
return char;
}
// e.g.
var oldStr = '(中文)';
var newStr = oldStr.replace(/(&#\d+;)/g, function(matched) {
return getCharByEntityNumber(matched);
});
console.log(newStr); // => (中文)
