如何处理JSON中的特殊字符

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何处理JSON中的特殊字符相关的知识,希望对你有一定的参考价值。

JSON 是适用于 Ajax 应用程序的一种有效格式,原因是它使 javascript 对象和字符串值之间得以快速转换。由于 Ajax
应用程序非常适合将纯文本发送给服务器端程序并对应地接收纯文本,相比不能生成文本的 API,能生成文本的 API 自然更可取;而且,JSON 让您能够处理本地
JavaScript 对象,而无需为如何表示这些对象多费心思。

XML 也可以提供文本方面的类似益处,但用于将 JavaScript 对象转换成 XML 的几个现有 API 没有 JSON API
成熟;有时,您必须在创建和处理 JavaScript 对象时格外谨慎以确保所进行的处理能与所选用的 XML 会话 API 协作。但对于
JSON,情况就大不相同:它能处理几乎所有可能的对象类型,并会返回给您一个非常好的 JSON 数据表示。 因此,JSON 的最大价值在于可以将
JavaScript 真的作为 JavaScript 而非数据格式语言进行处理。

您所学到的所有有关使用 JavaScript 对象的技巧都可以应用到代码中,而无需为如何将这些对象转变成文本而多费心思。

1. 回车问题

JSON传值的时候,如果有回车符就会挂的。我们可以使用正则来去掉回车符:

view
source
print?

1
$str = preg_replace("\'([\\r\\n])[\\s]+\'", "", $str);

2

3
// 不用正则

4
$str = str_replace("\\n","",$str);

转出来的字符串就没有回车符的困扰了。

顺便记录一个php过滤脚本:

view
source
print?

01
<?php

02
// $document 应包含一个 html 文档。

03
// 本例将去掉 HTML 标记,javascript 代码

04
// 和空白字符。还会将一些通用的

05
// HTML 实体转换成相应的文本。

06

07
$search = array ("\'<script[^>]*?>.*?</script>\'si", // 去掉 javascript

08
"\'<[\\/\\!]*?[^<>]*?>\'si", // 去掉 HTML 标记

09
"\'([\\r\\n])[\\s]+\'", // 去掉空白字符

10
"\'&(quot|#34);\'i", // 替换 HTML 实体

11
"\'&(amp|#38);\'i",

12
"\'&(lt|#60);\'i",

13
"\'&(gt|#62);\'i",

14
"\'&(nbsp|#160);\'i",

15
"\'&(iexcl|#161);\'i",

16
"\'&(cent|#162);\'i",

17
"\'&(pound|#163);\'i",

18
"\'&(copy|#169);\'i",

19
"\'(\\d+);\'e"); // 作为 PHP 代码运行

20

21
$replace = array ("",

22
"",

23
"\\\\1",

24
"\\"",

25
"&",

26
"<",

27
">",

28
" ",

29
chr(161),

30
chr(162),

31
chr(163),

32
chr(169),

33
"chr(\\\\1)");

34

35
$text = preg_replace ($search, $replace, $document);

36
?>

2. HTML特殊字符

从服务器端以JSON格式将数据传递到客户端后,通过JS显示在HTML页面时,有一些特殊字符不能直接显示,如后台传递过来的是
\'<b>msg</b> #\' 通过JS显示在HTML页面中时,显示成了 msg # ,并不是msg
#,这是由于<与>之间的内容看作是HTML标签了,而以&开头的 与#为HTML实体,所以显示不正常。

解决办法很简单,在JS将其渲染到HTML页面前转换一下即可:

view
source
print?

01
<script type="text/javascript">

02
var str = \'<b>msg</b> #\';

03
document.all.div1.innerHTML=\'<pre>\'+str+\'</pre>\';

04

05
//js中的字符串正常显示在HTML页面中

06
String.prototype.displayHtml= function()

07
//将字符串转换成数组

08
var
strArr = this.split(\'\');

09
//HTML页面特殊字符显示,空格本质不是,但多个空格时浏览器默认只显示一个,所以替换

10
var
htmlChar="&<>";

11
for(var
i = 0; i< str.length;i++)

12
//查找是否含有特殊的HTML字符

13
if(htmlChar.indexOf(str.charAt(i)) !=-1)

14
//如果存在,则将它们转换成对应的HTML实体

15
switch
(str.charAt(i))

16
case
\'<\':

17
strArr.splice(i,1,\'<\');

18
break;

19
case
\'>\':

20
strArr.splice(i,1,\'>\');

21
break;

22
case
\'&\':

23
strArr.splice(i,1,\'&\');

24


25


26


27
return
strArr.join(\'\');

28


29
alert(str.displayHtml());

30
document.all.div2.innerHTML=str.displayHtml();

31
</script>

3. escape()函数

该函数可以处理空格、斜线和其他任何可能影响浏览器的内容,并将它们转换成 Web 可用字符(比如,空格会被转换成
%20,浏览器并不会将其视为空格处理,而是不做更改,将其直接传递到服务器)。之后,服务器会(通常自动)再把它们转换回它们传输后的本来 “面目”。

view
source
print?

1
var url = "nowamagic.php?people="
+ escape(people.toJSONString());

2
request.open("GET", url, true);

3
request.onreadystatechange = updatePage;

4
request.send(null);

这种做法的缺点有两个: 在使用 GET 请求发送大块数据时,对 URL 字符串有长度限制。虽然这个限制很宽泛,但对象的 JSON
字符串表示的长度可能超出您的想象,尤其是在使用极其复杂的对象时更是如此。在跨网络以纯文本发送所有数据的时候,发送数据面临的不安全性超出了您的处理能力。

简言之,以上是 GET 请求的两个限制,而不是简单的两个与 JSON
数据相关的事情。在想要发送用户名和姓之外的更多内容,比如表单中的选择时,二者可能会需要多加注意。若要处理任何机密或极长的内容,可以使用 POST 请求。

4. 引号问题

JSON中如果包含引号或双引号,会破坏JSON的格式。有两种方法可以解决。

在入库的时候可以使用addslashes()函数处理一下字符串,给引号前加上斜杠。被改的字符包括单引号 (\')、双引号 (")、反斜线 backslash
(\\) 以及空字符NULL。

view
source
print?

1
$text = addslashes($text);

JavaScript的话,可以这样:

view
source
print?

1
function valueReplace(v)

2
v=v.toString().replace(new
RegExp(\'(["\\"])\', \'g\'),"\\\\\\"");

3
return
v;

4


5
var eValue = encodeURI($.trim(valueReplace(e.value)))
参考技术A   1. 回车问题
  JSON传值的时候,如果有回车符就会挂的。我们可以使用正则来去掉回车符:
  2. HTML特殊字符
  从服务器端以JSON格式将数据传递到客户端后,通过JS显示在HTML页面时,有一些特殊字符不能直接显示,如后台传递过来的是 '<b>msg</b> #' 通过JS显示在HTML页面中时,显示成了 msg # ,并不是msg #,这是由于<与>之间的内容看作是HTML标签了,而以&开头的 与#为HTML实体,所以显示不正常。
  解决办法很简单,在JS将其渲染到HTML页面前转换一下即可:

  3. escape()函数
  该函数可以处理空格、斜线和其他任何可能影响浏览器的内容,并将它们转换成 Web 可用字符(比如,空格会被转换成 %20,浏览器并不会将其视为空格处理,而是不做更改,将其直接传递到服务器)。之后,服务器会(通常自动)再把它们转换回它们传输后的本来 “面目”。
  4. 引号问题
  JSON中如果包含引号或双引号,会破坏JSON的格式。有两种方法可以解决。
  在入库的时候可以使用addslashes()函数处理一下字符串,给引号前加上斜杠。被改的字符包括单引号 (')、双引号 (")、反斜线 backslash (\) 以及空字符NULL。
参考技术B   您好,我来为您解答:  可以考虑在json之前先把数据进行编码一下,比如eacape或base64。这样就不用考虑特殊字符了。  服务端:含有中文非UTF8字符串->编码(escape或者base64)->json_encode -> 输出到客户端  客户端:json数据捕获 -> 解码(unescape或者unbase64)  希望我的回答对你有帮助。 参考技术C 转义即可转义即可转义即可

如何处理jQuery选择器中的特殊符号

一般情况下,在jQuery选择器中,我们很少会用到诸如逗.地、逗#地、逗(地、逗[地等特殊字符,因为根据W3C规定,HTML文档中属性的值是不能包含有这些个特殊字符的,但是在实际应用中,偶尔也会遇到表达式中含有逗#地和逗.地等特殊字符,正如我的Skygq表单验证和表单ajax提交合体版插件,在许多人的使用过程中出现了需要选择器中支持逗.地的操作(他们都是java程序员)。

那么是如何处理这些个特殊字符的呢看
要想让jQuery能处理这些特殊字符,使用普通的方式处理的话,是不照的,是必须要进行转义的。

HTML代码:

1

<div id="id.a">aa</div>

2

<div id="id#b">bb</div>

Jquery代码:

view
source

print?

1

var $id_a
= $('#id.a');//jQuery对象,实际上是没取到元素的

2

var $id_b
= $('#id#b');//jQuery对象,实际上是没取到元素的

3

alert(
$id_a.length);//输出0

4

alert(
$id_b.length);//输出0

5

var $id_right_a
= $('#id\\.a');//jQuery对象,对特殊字符,我们转义一下

6

var $id_right_b
= $('#id\\#b');//jQuery对象,对特殊字符,我们转义一下

7

alert(
$id_right_a.html() );//正确输出"aa"

8

alert(
$id_right_b.html() );//正确输出"bb"
参考技术A 需要转义下,最好是不要出现特殊符号,因为这样jquery对页面检索会很慢的。

以上是关于如何处理JSON中的特殊字符的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 XML 中 URL 中的特殊字符

从 PHP 生成 SQL 时如何处理 SQL 表名中的特殊字符?

如何处理jQuery选择器中的特殊符号

iOS 如何处理传递给 AFHTTPSessionManager GET 方法的空格或特殊字符?

whatsapp 是如何处理特殊字符、unicode 和 emoji 的

[IT学习]Python如何处理异常特殊字符