一、HTML转义
转义字符串(Escape Sequence)也称字符实体(Character Entity)。在HTML中,定义转义字符串的原因有两个:第一个原因是像“<”和“>”这类符号已经用来表示HTML标签,因此就不能直接当作文本中的符号来使用。为了在HTML文档中使用这些符号,就需要定义它的转义字符串。当解释程序遇到这类字符串时就把它解释为真实的字符。在输入转 义字符串时,要严格遵守字母大小写的规则。第二个原因是,有些字符在ASCII字符集中没有定义,因此需要使用转义字符串来表示。
转义字符串(Escape Sequence),即字符实体(Character Entity)分成三部分:第一部分是一个&符号,英文叫ampersand;第二部分是实体(Entity)名字或者是#加上实体(Entity)编号;第三部分是一个分号。
比如,要显示小于号(<),就可以写 < 或者 < 。
用实体(Entity)名字的好处是比较好理解,一看lt,大概就猜出是less than的意思,但是其劣势在于并不是所有的浏览器都支持最新的Entity名字。而实体(Entity)编号,各种浏览器都能处理。
提示:实体名称(Entity)是区分大小写的。
备注:同一个符号,可以用“实体名称”和“实体编号”两种方式引用,“实体名称”的优势在于便于记忆,但不能保证所有的浏览器都能顺利识别它,而“实体编号”则没有这种担忧,但它实在不方便记忆。
最常用的字符实体 Character Entities
| 显示 | 说明 | 实体名称 | 实体编号 |
|---|---|---|---|
| 半方大的空白 |   |   | |
| 全方大的空白 |   |   | |
| 不断行的空白格 | |   | |
| < | 小于 | < | < |
| > | 大于 | > | > |
| & | &符号 | & | & |
| “ | 双引号 | " | " |
| © | 版权 | © | © |
| ® | 已注册商标 | ® | ® |
| ™ | 商标(美国) | ™ | ™ |
| × | 乘号 | × | × |
| ÷ | 除号 | ÷ | ÷ |
二、JavaScript编码
在JavaScrip中的字符串计算长度是以多少个文字,而不是多少个字节,即一个中文也只占一个长度。
//将字符串以unicode的编码输出
test = "你好abc";
str = "";
for( i=0; i<test.length; i++ )
{
temp = test.charCodeAt(i).toString(16);
str += "\\u"+ new Array(5-String(temp).length).join("0") +temp;
}
document.write (str);
//求真正的字节长度
String.prototype.byteLength = function() {
var totalLen = 0;
var charCode;
for(var i=0;i<this.length;i++) {
charCode = this.charCodeAt(i);
if(charCode < 0x007f) {
totalLen += 1;
} else if ((0x0080 <= charCode) && (charCode <= 0x07ff)) {
totalLen += 2;
} else if((0x0800 <= charCode) && (charCode <= 0xffff)) {
totalLen += 3;
}
}
return totalLen;
}
关于encodeURI()和encodeURIComponent():
encodeURI()和encodeURIComponent()方法用于编码传递给浏览器的URI(统一资源标识符)。有效的URI不能包含某些字符,如空格。这两个方法用于编码URI,这样用专门的UTF-8编码替换所有的非有效字符,就可以使浏览器仍能够接受并理解它们。
encodeURI()方法用于处理完整的URI(例如,http://www.wrox.com/illegal value.htm),而encodeURIComponent()用于处理URI的一个片断(如前面的URI中的illegal value.htm)。这两个方法的主要区别是encodeURI()方法不对URI中的特殊字符进行编码,如冒号、前斜杠、问号和英镑符号,而encodeURIComponent()则对它发现的所有非标准字符进行编码。例如:
![]()
![]()
可以看到,除空格外,第一个URI无任何改变,空格被替换为%20。第二个URI中的所有非字母数字字符都被替换成它们对应的编码,基本上使这个URI变得无用。这就是encodeURI()可以处理完整URI,而encodeURIComponent()只能处理附加在已有URI末尾的字符串的原因。
总的来说,传递参数时需要使用encodeURIComponent,这样组合的url才不会被#等特殊字符截断。进行url跳转时应该整体使用encodeURI,Location.href=encodeURI(“http://blog.endlesscode.com?tag=转义和编码”)。
关于escape、encodeURI、encodeURIComponent转义的字符区别:
| 函数 | 不变换字符 |
| escape (69个) | *+-./@_0-9a-zA-Z |
| encodeURI (82个) | !#$&’()*+,-./:;=?@_~ 0-9a-zA-Z |
| encodeURIComponent (71个) | !’()*-._~0-9a-zA-Z |
常见的字符编码:
| 字符 | 十六进制 |
| + | %2B |
| 空格 | %20 |
| / | %2F |
| ? | %3F |
| % | %25 |
| # | %23 |
| & | %26 |
| = | %3D |
引用:
- HTML转义字符
- 《JavaScript高级程序设计》