Repository navigation
Expand file tree
/
Copy pathindex.md
More file actions
89 lines (62 loc) · 4.64 KB
/
Copy pathindex.md
File metadata and controls
89 lines (62 loc) · 4.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
---
title: encodeURIComponent()
slug: Web/JavaScript/Reference/Global_Objects/encodeURIComponent
---
{{jsSidebar("Objects")}}
**`encodeURIComponent()`** - метод, кодирующий компонент универсального идентификатора ресурса (URI) заменой каждой определённой последовательности символов одной, двумя, тремя или четырьмя последовательностями символов, представленных в кодировке UTF-8 (будет только 4 управляющих последовательности для символов, состоящих из 2 "суррогатных" символов).
## Синтаксис
```
encodeURIComponent(str);
```
### Параметры
- `str`
- : Строка. Компонент URI.
## Описание
`encodeURIComponent` изменяет все символы, за исключением следующих: латинские буквы, десятичные цифры, `- _ . ! ~ * ' ( )`
Замечание: {{jsxref("URIError")}} будет брошена, если попытаться закодировать суррогат, который не является частью высоко-низкой пары, например:
```js
// низко-высокая пара - нормально
console.log(encodeURIComponent("\uD800\uDFFF"));
// один высокий суррогат бросит "URIError: malformed URI sequence"
console.log(encodeURIComponent("\uD800"));
// один низкий суррогат бросит "URIError: malformed URI sequence"
console.log(encodeURIComponent("\uDFFF"));
```
Чтоб избежать неожиданных запросов к серверу, вам следует вызывать `encodeURIComponent` для любых вводимых пользователем параметров, используемых как часть URI. Например, он мог написать "`Thyme &time=again`" для переменной `comment`. Неиспользование `encodeURIComponent` для неё даст `comment=Thyme%20&time=again`. Заметьте, что амперсанд и знак равно выделяют новую пару ключ-значение. Так что вместо комментария "`Thyme &time=again`", вы получите два POST параметра, один - "`Thyme`", а другой (`time`) равный "`again"`.
`Для application/x-www-form-urlencoded` пробелы должны быть заменены на "+", поэтому вам может понадобиться `encodeURIComponent` с дополнительной заменой "%20" на "+".
Чтобы строго соблюдать [RFC 3986](https://tools.ietf.org/html/rfc3986) (который резервирует !, ', (, ), и \*), даже не смотря на то, что символы не используют сформированных URI разделителей, можно безопасно использовать следующие:
```js
function fixedEncodeURIComponent(str) {
return encodeURIComponent(str).replace(/[!'()*]/g, function (c) {
return "%" + c.charCodeAt(0).toString(16);
});
}
```
## Примеры
Пример представляет специальное кодирование, требуемое для заголовков сервера в UTF-8: `Content-Disposition` и `Link` (к примеру, имена файлов в UTF-8):
```js
var fileName = "my file(2).txt";
var header =
"Content-Disposition: attachment; filename*=UTF-8''" +
encodeRFC5987ValueChars(fileName);
console.log(header);
// логирует "Content-Disposition: attachment; filename*=UTF-8''my%20file%282%29.txt"
function encodeRFC5987ValueChars(str) {
return (
encodeURIComponent(str)
// Замечание: хотя RFC3986 резервирует "!", RFC5987 это не делает, так что нам не нужно избегать этого
.replace(/['()]/g, escape) // i.e., %27 %28 %29
.replace(/\*/g, "%2A")
// Следующее не требуется для кодирования процентов для RFC5987, так что мы можем разрешить немного больше читаемости через провод: |`^
.replace(/%(?:7C|60|5E)/g, unescape)
);
}
```
## Спецификации
{{Specifications}}
## Совместимость с браузерами
{{Compat}}
## Смотрите также
- {{jsxref("decodeURI")}}
- {{jsxref("encodeURI")}}
- {{jsxref("decodeURIComponent")}}