js字符转义(escape)的几种方案

一、JSON.js

首先取自DouglasCrockford的方案,应该较多人使用。json.js和json2.js都差不多的。

// https://raw.github.com/douglascrockford/JSON-js/master/json.js
var meta = { // table of character substitutions
	'\b' : '\\b',
	'\t' : '\\t',
	'\n' : '\\n',
	'\f' : '\\f',
	'\r' : '\\r',
	'"' : '\\"',
	'\\' : '\\\\'
};
function quote(string) {
	// If the string contains no control characters, no quote characters, and no
	// backslash characters, then we can safely slap some quotes around it.
	// Otherwise we must also replace the offending characters with safe escape
	// sequences.

	escapable.lastIndex = 0;
	return escapable.test(string) ? '"'
			+ string.replace(escapable, function(a) {
						var c = meta[a];
						return typeof c === 'string' ? c : '\\u'
								+ ('0000' + a.charCodeAt(0).toString(16))
										.slice(-4);
					}) + '"' : '"' + string + '"';
}

二、依然取自D.C大大,在json_parse.js里。

// https://raw.github.com/douglascrockford/JSON-js/master/json_parse.js
var escapee = {
	'"' : '"',
	'\\' : '\\',
	'/' : '/',
	b : '\b',
	f : '\f',
	n : '\n',
	r : '\r',
	t : '\t'
};
string = function() {
	// Parse a string value.
	var hex, i, string = ', uffff;

	// When parsing for string values, we must look for " and \ characters.
	if (ch === '"') {
		while (next()) {
			if (ch === '"') {
				next();
				return string;
			} else if (ch === '\\') {
				next();
				if (ch === 'u') {
					uffff = 0;
					for (i = 0; i < 4; i += 1) {
						hex = parseInt(next(), 16);
						if (!isFinite(hex)) {
							break;
						}
						uffff = uffff * 16 + hex;
					}
					string += String.fromCharCode(uffff);
				} else if (typeof escapee[ch] === 'string') {
					string += escapee[ch];
				} else {
					break;
				}
			} else {
				string += ch;
			}
		}
	}
	error("Bad string");
}

三、仍为D.C大大的,在json_parse_state.js里。

// https://raw.github.com/douglascrockford/JSON-js/master/json_parse_state.js
var escapes = { // Escapement translation table
	'\\' : '\\',
	'"' : '"',
	'/' : '/',
	't' : '\t',
	'n' : '\n',
	'r' : '\r',
	'f' : '\f',
	'b' : '\b'
};
function debackslashify(text) {
	// Remove and replace any backslash escapement.
	return text.replace(/\\(?:u(.{4})|([^u]))/g, function(a, b, c) {
				return b ? String.fromCharCode(parseInt(b, 16)) : escapes[c];
			});
}

四、旧版的json.js,moontools也是这种方案的?。这里/[\x00-\x1f\\"]/g代表什么意思呢?

// JSON用特殊字符转义
var special = {
	'\b' : '\\b',
	'\t' : '\\t',
	'\n' : '\\n',
	'\f' : '\\f',
	'\r' : '\\r',
	'"' : '\\"',
	'\\' : '\\\\'
};
var escape = function(chr) {
	return special[chr] || '\\u'
			+ ('0000' + chr.charCodeAt(0).toString(16)).slice(-4)
};

function _escape(obj){
	return '"' + obj.replace(/[\x00-\x1f\\"]/g, escape) + '"'
}

五、我当前的方案,感觉比较简单明了,但会不会有未知的问题呢?待继续明了。

function StringAs(string) {
	return '"' + string.replace(/(\\|\"|\n|\r|\t)/g, "\\$1") + '"';
}

六、最后发现这里也有http://relucent.iteye.com/blog/646016

时间: 2024-09-30 08:45:21

js字符转义(escape)的几种方案的相关文章

js实现刷新页面后回到记录时滚动条的位置【两种方案可选】_javascript技巧

当div中绑定数据,给它一个属性overflow-y: scroll,添加长度大小,使其能够出现滚动条:每次刷新的时候滚动条总是会出现在最上方,这使我很头疼,经过查阅网上资料,返现两种方法可行.如下: 第一种方案 将上一个页面的div的scrolltop距离长度记录在cookie中,然后通过js调整刷新页面时的长度记录,代码如下: js代码: <script> var _h = 0; function SetH(o) { _h = o.scrollTop SetCookie("a&q

js动态拼接正则表达式的两种方法

 这篇文章主要介绍了js动态拼接正则表达式的两种方法,需要的朋友可以参考下 方法一:    做项目的时候可能会遇到用js验证表单输入正确性的需求,这时候就需要用到js的正则表达式.举个例子:比如说要验证月份,格式为:'yyyy-MM',这个正则表达式写起来很简单,实在写不出,也可以Google.百度一把,网上例子一大堆!但是js正则表达式就这样写死也会带来新的问题:如果配置文件的月份格式改了呢?改成'yyyyMM'.或者是'yyyy_MM'...呢??我们是不是要记得去把js中的正则表达式也跟着

SVG/VML+JS实现跨浏览器的矢量图形实现方案

文章简介:SVG/VML+JS实现跨浏览器的矢量图形实现方案. Raphael JS库是在webrebuild交流会上听专家将到的,后来就看了下,果然很强大--通过SVG/VML+JS实现跨浏览器的矢量图形实现方案. 这其实和cufon等网络字体的实现原理是有些类似的:非IE浏览器使用SVG绘图,然后IE中使用VML.它的目的是想要提供一种简单易用的真正跨浏览器的矢量图形实现方案,包括一些动画效果. Raphael的语法也很简单,基本上了解SVG就会很容易上手的: var c = paper.p

现有的Web打印控制技术分成几种方案

web|web打印|控制 现有的Web打印控制技术分成几种方案 自定义控件完成打印 利用IE自带的WebBrowser控件实现打印 利用第三方控件实现打印以下主要谈前两个方面的内容 一. 自定义控件方式自定义控件方式就是利用VB或VC等工具生成COM组件,用定义好的打印格式来分析打印源文件从而实现打印.只有将生成的组件下载并注册到客户机上,才能实现在客户端的打印.难点主要是定义打印格式.如何来分析打印源文件.现有的比较好的方法是利用XML技术来全面的解决问题,利用XML可以非常容易地定义打印目标

js动态拼接正则表达式的两种方法_javascript技巧

方法一: 做项目的时候可能会遇到用js验证表单输入正确性的需求,这时候就需要用到js的正则表达式.举个例子:比如说要验证月份,格式为:'yyyy-MM',这个正则表达式写起来很简单,实在写不出,也可以Google.百度一把,网上例子一大堆!但是js正则表达式就这样写死也会带来新的问题:如果配置文件的月份格式改了呢?改成'yyyyMM'.或者是'yyyy_MM'...呢??我们是不是要记得去把js中的正则表达式也跟着一遍遍的改呢?? 这时候我们就要问了:怎样才能写出动态的正则表达式呢,修改了配置文

xml-JDOM中XML输出如何进行字符转义的设置?

问题描述 JDOM中XML输出如何进行字符转义的设置? JDOM中XML输出如何进行字符转义的设置? JDOM中Text类下有CDATA类,可以包裹文本,输出时不进行转义: 如何使用output类下的format类进行转义设置?是否要使用EscapeStrategy接口? output.support类下有FormatStack类,具有方法 setEscapeOutput(boolean escape) ,如何使用? 解决方案 http://blog.csdn.net/teedry/articl

移动适配的几种方案(三种方案)_javascript技巧

1.直接利用js适配 (function (doc, win) { var docEl = doc.documentElement, resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize', recalc = function () { var clientWidth = docEl.clientWidth; if (!clientWidth) return; docEl.style.fontSize

详解js跨域原理以及2种解决方案_javascript技巧

1.什么是跨域 我们经常会在页面上使用ajax请求访问其他服务器的数据,此时,客户端会出现跨域问题. 跨域问题是由于javascript语言安全限制中的同源策略造成的. 简单来说,同源策略是指一段脚本只能读取来自同一来源的窗口和文档的属性,这里的同一来源指的是主机名.协议和端口号的组合. 例如: 2.实现原理 在HTML DOM中,Script标签是可以跨域访问服务器上的数据的.因此,可以指定script的src属性为跨域的url,从而实现跨域访问. 例如: 这种访问方式是不行的.但是如下方式,

Jquery命名冲突解决的五种方案分享_jquery

因为许多 JavaScript 库使用 $ 作为函数或变量名,jquery也一样.其实$只是jquery的一个别名而已,假如我们需要使用 jquery 之外的另一 js 库,我们可以通过调用 $.noConflict() 向该库返回控制权.下面是收集到解决这一问题的五种方案,总有一种你会用得上的. 例一: 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w