### JavaScript中encodeURI和decodeURI方法使用介绍
#### 一、基本概念
在JavaScript中,`encodeURI`和`decodeURI`是一对用于处理URL编码的重要函数。它们主要用于解决URL中包含非ASCII字符时可能出现的问题。
- **encodeURI**: 这个函数的主要作用是将一个字符串转换为合法的URL格式,它可以将所有非ASCII字符转换为相应的百分号编码形式(例如,中文字符“张”会被转换为“%E5%BC%A0”)。值得注意的是,`encodeURI`不会对以下字符进行编码:“:”、“/”、“?”、“#”、“;”、“=”以及“&”,因为这些字符在URL中有特殊的含义。
- **decodeURI**: 这个函数的作用正好相反,它将一个经过`encodeURI`编码后的字符串转换回原始的字符串形式。如果输入的字符串不是通过`encodeURI`编码得到的,则可能会出现乱码或不正确的结果。
除了`encodeURI`和`decodeURI`之外,JavaScript还提供了另外两个相关的函数:
- **encodeURIComponent**: 类似于`encodeURI`,但是它会对更多的字符进行编码,包括“:”、“/”、“?”、“#”、“;”、“=”以及“&”。因此,在需要对URL的某个部分进行编码时(如查询字符串),通常使用`encodeURIComponent`而不是`encodeURI`。
- **decodeURIComponent**: 这是`encodeURIComponent`的逆操作,用于解码由`encodeURIComponent`编码的字符串。
#### 二、编码与解码的区别
- **`encodeURI`与`encodeURIComponent`的区别**:
- `encodeURI`不对URL中的保留字符进行编码。
- `encodeURIComponent`对所有的非保留字符进行编码,并且也对保留字符进行编码。
- 使用场景:`encodeURI`适用于整个URL的编码,而`encodeURIComponent`适用于URL的部分组件,比如查询字符串中的键和值。
- **`decodeURI`与`decodeURIComponent`的区别**:
- `decodeURI`用于解码由`encodeURI`编码的字符串。
- `decodeURIComponent`用于解码由`encodeURIComponent`编码的字符串。
- 使用场景:通常情况下,如果使用了`encodeURI`进行编码,则应该使用`decodeURI`来进行解码;同样地,如果使用了`encodeURIComponent`进行编码,则应该使用`decodeURIComponent`来进行解码。
#### 三、示例代码解析
```javascript
var uriStr = "http://.baidu.com?name=张三&num=001&zs";
var uriec = encodeURI(uriStr);
console.log("编码后的: " + uriec);
var uridc = decodeURI(uriec);
console.log("解码后的: " + uridc);
```
**解析**:
1. **变量初始化**:首先定义了一个字符串`uriStr`,其中包含了中文字符“张三”以及其他特殊符号。
2. **编码操作**:使用`encodeURI`函数对`uriStr`进行编码,将非ASCII字符转为百分号编码。注意,因为`encodeURI`不会对某些特殊字符(如“?”、“&”等)进行编码,所以这些字符保持不变。
3. **输出编码结果**:输出编码后的字符串`uriec`。
4. **解码操作**:使用`decodeURI`函数对`uriec`进行解码,恢复原始字符串。
5. **输出解码结果**:输出解码后的字符串`uridc`。
#### 四、注意事项
- 在使用`encodeURI`和`decodeURI`时需要注意,这些函数只能处理合法的URL字符串。如果输入的字符串不符合URL的规范,可能会导致编码或解码失败。
- 当处理URL的特定部分(如查询字符串)时,应优先使用`encodeURIComponent`和`decodeURIComponent`,以确保所有字符都被正确处理。
- 在实际应用中,还需要考虑到不同浏览器对于URL编码的支持程度可能存在差异,因此最好进行充分的测试。
通过以上的介绍,我们可以看出`encodeURI`和`decodeURI`及其相关函数在处理包含非ASCII字符的URL时是非常有用的工具。正确地使用这些函数能够帮助我们避免许多潜在的问题,并确保应用程序的正常运行。