jsesc
给定一些数据, jsesc 返回该数据的字符串化表示形式。耶稣类似于 JSON.stringify() 除了:
- 它输出JavaScript而不是JSON 默认情况下支持ES6地图和集合等数据结构;
- 它提供了 许多选项 自定义输出;
- 它的输出是ascii安全的 默认情况下,这要归功于它的用法 转义序列 在需要的地方。
对于任何输入,jsesc生成尽可能短的有效的仅限可打印ascii的输出。 这是一个在线演示。
可以使用Jsesc的输出来代替 JSON.stringify要避免的 mojibake 和其他编码问题,甚至 避免错误 当传递json格式的数据时(可能包含U+2028 LINE SEPARATOR, U+2029 PARAGRAPH SEPARATOR,或 孤独的代理人)到JavaScript解析器或UTF-8编码器。
安装
通过 npm:
npm install jsesc
在 node . js:
const jsesc = require('jsesc');
API
jsesc(value, options)
此函数接受一个值并返回该值的转义版本,其中任何不可打印的ASCII符号都使用尽可能短的(但有效的)转义。 用于JavaScript字符串的转义序列。第一个支持的值类型是字符串:
jsesc('Ich ♥ Bücher');
// → 'Ich \\u2665 B\\xFCcher'
jsesc('foo 𝌆 bar');
// → 'foo \\uD834\\uDF06 bar'
不是字符串,而是 value 也可以是数组、对象、映射、集合或缓冲区。在这种情况下, jsesc 返回值的字符串化版本,其中非可打印ASCII符号的任何字符都以相同的方式转义。
// Escaping an array
jsesc([
'Ich ♥ Bücher', 'foo 𝌆 bar'
]);
// → '[\'Ich \\u2665 B\\xFCcher\',\'foo \\uD834\\uDF06 bar\']'
// Escaping an object
jsesc({
'Ich ♥ Bücher': 'foo 𝌆 bar'
});
// → '{\'Ich \\u2665 B\\xFCcher\':\'foo \\uD834\\uDF06 bar\'}'
可选 options 参数接受一个具有以下选项的对象:
quotes
的默认值 quotes 选择是 'single'。这意味着任何发生 ' 在输入字符串中被转义为 \',以便输出可以在用单引号包装的字符串文本中使用。
jsesc('`Lorem` ipsum "dolor" sit \'amet\' etc.');
// → 'Lorem ipsum "dolor" sit \\\'amet\\\' etc.'
jsesc('`Lorem` ipsum "dolor" sit \'amet\' etc.', {
'quotes': 'single'
});
// → '`Lorem` ipsum "dolor" sit \\\'amet\\\' etc.'
// → "`Lorem` ipsum \"dolor\" sit \\'amet\\' etc."
如果您希望将输出作为用双引号括起来的字符串文本的一部分,请设置 quotes 选项 'double'。
jsesc('`Lorem` ipsum "dolor" sit \'amet\' etc.', {
'quotes': 'double'
});
// → '`Lorem` ipsum \\"dolor\\" sit \'amet\' etc.'
// → "`Lorem` ipsum \\\"dolor\\\" sit 'amet' etc."
如果你想使用输出作为模板文字的一部分(即用反引号括起来),设置 quotes 选项 'backtick'。
jsesc('`Lorem` ipsum "dolor" sit \'amet\' etc.', {
'quotes': 'backtick'
});
// → '\\`Lorem\\` ipsum "dolor" sit \'amet\' etc.'
// → "\\`Lorem\\` ipsum \"dolor\" sit 'amet' etc."
// → `\\\`Lorem\\\` ipsum "dolor" sit 'amet' etc.`
这个设置也会影响数组和对象的输出:
jsesc({ 'Ich ♥ Bücher': 'foo 𝌆 bar' }, {
'quotes': 'double'
});
// → '{"Ich \\u2665 B\\xFCcher":"foo \\uD834\\uDF06 bar"}'
jsesc([ 'Ich ♥ Bücher', 'foo 𝌆 bar' ], {
'quotes': 'double'
});
// → '["Ich \\u2665 B\\xFCcher","foo \\uD834\\uDF06 bar"]'
numbers
的默认值 numbers 选择是 'decimal'。这意味着任何数值都使用十进制整数字面值表示。其他有效的选项包括 binary, octal, hexadecimal,分别产生二进制整数字面值、八进制整数字面值和十六进制整数字面值。
jsesc(42, {
'numbers': 'binary'
});
// → '0b101010'
jsesc(42, {
'numbers': 'octal'
});
// → '0o52'
jsesc(42, {
'numbers': 'decimal'
});
// → '42'
jsesc(42, {
'numbers': 'hexadecimal'
});
// → '0x2A'
wrap
这个 wrap 选项接受布尔值(true 或 false),默认为 false (禁用)。启用后,输出是用引号括起来的有效JavaScript字符串。参数指定引号的类型 quotes 设置。
jsesc('Lorem ipsum "dolor" sit \'amet\' etc.', {
'quotes': 'single',
'wrap': true
});
// → '\'Lorem ipsum "dolor" sit \\\'amet\\\' etc.\''
// → "\'Lorem ipsum \"dolor\" sit \\\'amet\\\' etc.\'"
jsesc('Lorem ipsum "dolor" sit \'amet\' etc.', {
'quotes': 'double',
'wrap': true
});
// → '"Lorem ipsum \\"dolor\\" sit \'amet\' etc."'
// → "\"Lorem ipsum \\\"dolor\\\" sit \'amet\' etc.\""
es6
这个 es6 选项接受布尔值(true 或 false),默认为 false (禁用)。启用后,输入中的任何星形Unicode符号都将使用 ECMAScript 6 Unicode码点转义序列 而不是为每个代理部分使用单独的转义序列。如果您担心与ES5环境的向后兼容性,请不要启用此设置。如果 json 设置为启用时,值为 es6 设置被忽略(就像它被忽略一样) false).
// By default, the `es6` option is disabled:
jsesc('foo 𝌆 bar 💩 baz');
// → 'foo \\uD834\\uDF06 bar \\uD83D\\uDCA9 baz'
// To explicitly disable it:
jsesc('foo 𝌆 bar 💩 baz', {
'es6': false
});
// → 'foo \\uD834\\uDF06 bar \\uD83D\\uDCA9 baz'
// To enable it:
jsesc('foo 𝌆 bar 💩 baz', {
'es6': true
});
// → 'foo \\u{1D306} bar \\u{1F4A9} baz'
escapeEverything
这个 escapeEverything 选项接受布尔值(true 或 false),默认为 false (禁用)。启用后,输出中的所有符号都被转义——甚至包括可打印的ASCII符号。
jsesc('lolwat"foo\'bar', {
'escapeEverything': true
});
// → '\\x6C\\x6F\\x6C\\x77\\x61\\x74\\"\\x66\\x6F\\x6F\\\'\\x62\\x61\\x72'
// → "\\x6C\\x6F\\x6C\\x77\\x61\\x74\\\"\\x66\\x6F\\x6F\\'\\x62\\x61\\x72"
此设置还会影响数组和对象中字符串字面值的输出。
minimal
这个 minimal 选项接受布尔值(true 或 false),默认为 false (禁用)。当启用时,输出中只有一组有限的符号被转义:
- U + 0000
\0 - U + 0008
\b - U + 0009
\t - U + 000
\n - U + 000 c
\f - U + 000 d
\r - U + 005 c
\\ - U + 2028
\u2028 - U + 2029
\u2029 - 用于包装字符串字面值的任何符号(基于 这个
quotes选项) - 孤独的代理人
注意:启用此选项后,jsesc输出不再保证是ascii安全的。
jsesc('foo\u2029bar\nbaz©qux𝌆flops', {
'minimal': false
});
// → 'foo\\u2029bar\\nbaz©qux𝌆flops'
isScriptContext
这个 isScriptContext 选项接受布尔值(true 或 false),默认为 false (禁用)。启用后,会出现 </script 和 </style 在输出中被转义为 <\/script 和 <\/style, <!-- 被转义为 \x3C!-- (或 \u003C!-- 当 json 选项已启用)。当jsesc的输出最终作为a的一部分时,此设置非常有用 <script> 或 <style> 元素在HTML文档中。
jsesc('foo</script>bar', {
'isScriptContext': true
});
// → 'foo<\\/script>bar'
compact
这个 compact 选项接受布尔值(true 或 false),默认为 true (使)。启用后,数组和对象的输出尽可能紧凑;格式不太好。
jsesc({ 'Ich ♥ Bücher': 'foo 𝌆 bar' }, {
'compact': true // this is the default
});
// → '{\'Ich \u2665 B\xFCcher\':\'foo \uD834\uDF06 bar\'}'
jsesc({ 'Ich ♥ Bücher': 'foo 𝌆 bar' }, {
'compact': false
});
// → '{\n\t\'Ich \u2665 B\xFCcher\': \'foo \uD834\uDF06 bar\'\n}'
jsesc([ 'Ich ♥ Bücher', 'foo 𝌆 bar' ], {
'compact': false
});
// → '[\n\t\'Ich \u2665 B\xFCcher\',\n\t\'foo \uD834\uDF06 bar\'\n]'
此设置对字符串的输出没有影响。
indent
这个 indent 选项接受字符串值,默认值为 '\t'。当 compact 设置已禁用(false的值 indent 选项用于格式化数组和对象的输出。
jsesc({ 'Ich ♥ Bücher': 'foo 𝌆 bar' }, {
'compact': false,
'indent': '\t' // this is the default
});
// → '{\n\t\'Ich \u2665 B\xFCcher\': \'foo \uD834\uDF06 bar\'\n}'
jsesc({ 'Ich ♥ Bücher': 'foo 𝌆 bar' }, {
'compact': false,
'indent': ' '
});
// → '{\n \'Ich \u2665 B\xFCcher\': \'foo \uD834\uDF06 bar\'\n}'
jsesc([ 'Ich ♥ Bücher', 'foo 𝌆 bar' ], {
'compact': false,
'indent': ' '
});
// → '[\n \'Ich \u2665 B\xFCcher\',\n\ t\'foo \uD834\uDF06 bar\'\n]'
此设置对字符串的输出没有影响。
indentLevel
这个 indentLevel 选项接受一个数值,默认值为 0。它表示当前缩进级别,即值的次数 这个 indent 选项 是重复的。
jsesc(['a', 'b', 'c'], {
'compact': false,
'indentLevel': 1
});
// → '[\n\t\t\'a\',\n\t\t\'b\',\n\t\t\'c\'\n\t]'
jsesc(['a', 'b', 'c'], {
'compact': false,
'indentLevel': 2
});
// → '[\n\t\t\t\'a\',\n\t\t\t\'b\',\n\t\t\t\'c\'\n\t\t]'
json
这个 json 选项接受布尔值(true 或 false),默认为 false (禁用)。启用后,输出是有效的JSON。 十六进制字符转义序列 和 这个 \v 或 \0 转义序列 不使用。设置 json: true 意味着 quotes: 'double', wrap: true, es6: false尽管如果需要,仍然可以覆盖这些值——但在这种情况下,输出将不再是有效的JSON。
jsesc('foo\x00bar\xFF\uFFFDbaz', {
'json': true
});
// → '"foo\\u0000bar\\u00FF\\uFFFDbaz"'
jsesc({ 'foo\x00bar\xFF\uFFFDbaz': 'foo\x00bar\xFF\uFFFDbaz' }, {
'json': true
});
// → '{"foo\\u0000bar\\u00FF\\uFFFDbaz":"foo\\u0000bar\\u00FF\\uFFFDbaz"}'
jsesc([ 'foo\x00bar\xFF\uFFFDbaz', 'foo\x00bar\xFF\uFFFDbaz' ], {
'json': true
});
// → '["foo\\u0000bar\\u00FF\\uFFFDbaz","foo\\u0000bar\\u00FF\\uFFFDbaz"]'
// Values that are acceptable in JSON but aren’t strings, arrays, or object
// literals can’t be escaped, so they’ll just be preserved:
jsesc([ 'foo\x00bar', [1, '©', { 'foo': true, 'qux': null }], 42 ], {
'json': true
});
// → '["foo\\u0000bar",[1,"\\u00A9",{"foo":true,"qux":null}],42]'
// Values that aren’t allowed in JSON are run through `JSON.stringify()`:
jsesc([ undefined, -Infinity ], {
'json': true
});
// → '[null,null]'
注意: 在包含非字符串值的对象或数组上使用此选项依赖于 JSON.stringify()。对于像IE≤7这样的遗留环境,使用 一个 JSON polyfill。
lowercaseHex
这个 lowercaseHex 选项接受布尔值(true 或 false),默认为 false (禁用)。启用后,转义序列中的任何十六进制字母数字以及任何十六进制整数字面值(请参阅 这个 numbers 选项)中的字符都是小写的。
jsesc('Ich ♥ Bücher', {
'lowercaseHex': true
});
// → 'Ich \\u2665 B\\xfccher'
// ^^
jsesc(42, {
'numbers': 'hexadecimal',
'lowercaseHex': true
});
// → '0x2a'
// ^^
jsesc.version
表示语义版本号的字符串。
使用 jsesc 二进制
要使用 jsesc 在shell中安装二进制文件,使用npm全局安装jsesc:
npm install -g jsesc
之后你就可以从命令行转义字符串了:
$ jsesc 'föo ♥ bår 𝌆 baz'
f\xF6o \u2665 b\xE5r \uD834\uDF06 baz
要转义包含字符串值的数组或对象,请使用 -o/--object 选择:
$ jsesc --object '{ "föo": "♥", "bår": "𝌆 baz" }'
{'f\xF6o':'\u2665','b\xE5r':'\uD834\uDF06 baz'}
在这种情况下,要美化输出,请使用 -p/--pretty 选择:
$ jsesc --pretty '{ "föo": "♥", "bår": "𝌆 baz" }'
{
'f\xF6o': '\u2665',
'b\xE5r': '\uD834\uDF06 baz'
}
对于有效的JSON输出,使用 -j/--json 选择:
$ jsesc --json --pretty '{ "föo": "♥", "bår": "𝌆 baz" }'
{
"f\u00F6o": "\u2665",
"b\u00E5r": "\uD834\uDF06 baz"
}
读取本地JSON文件,转义任何非ascii符号,并将结果保存到新文件:
$ jsesc --json --object < data-raw.json > data-escaped.json
或者对在线JSON文件做同样的事情:
$ curl -sL "http://git.io/aorKgQ" | jsesc --json --object > data-escaped.json
看到 jsesc --help 以获取完整的选项列表。
支持
从v3.0.0开始,jsesc只支持Node.js v6+。
旧版本(jsesc v1.3.0之前)支持Chrome 27、Firefox 3、Safari 4、Opera 10、IE 6、Node.js v6.0.0、Narwhal 0.3.2、ringgojs 0.8-0.11、PhantomJS 1.9.0和Rhino 1.7RC4。 注意: 使用 json 对象或数组中包含非字符串值的选项 JSON.parse()。对于像IE≤7这样的遗留环境,使用 一个 JSON polyfill。
作者
| 马赛厄斯Bynens |
许可证
这个图书馆可以在 麻省理工学院 许可证。