关于特殊字符的处理

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

关于特殊字符的处理说明

(以下简称CRM)某些模块在处理一些特殊字符时会引起处理出错,本文档针对当前的CMR模块结构,给出如下解决方法,请对照《特殊字符处理流程图.vsd》阅读:

一、解决方法的思路:

由于CRM各模块处理的数据类型并不尽相同,某些特殊字符可能会在这个模块引起处理出错,但在另一模块是可以正常处理的。因此我们可以在数据提交给模块处理前,先对一些可能引起该模块处理出错的特殊字符进行转义替换,待该模块处理完这些数据后再反向转义替换回来即可。

以下我们将从整个CRM的角度分析各模块,列出一些可能引起处理出错的特殊字符:&:与符号。根据XML规范,如果属性值或元素内容中包含该字符,是需要先实体化为&

再进行处理的。因此我们在组织XML内容前,需要先对该字符进行转换,以免引起XML 的处理出错。

<:小于号。根据XML规范,如果属性值或元素内容中包含该字符,是需要先实体化为<

再进行处理的。因此我们在组织XML内容前,需要先对该字符进行转换,以免引起XML 的处理出错。

>:大于号。根据XML规范,如果属性值或元素内容中包含该字符,是需要先实体化为>

再进行处理的。因此我们在组织XML内容前,需要先对该字符进行转换,以免引起XML 的处理出错。

<>:成对的尖括号。前台界面有时会用请求到的数据动态创建HMTL页面的DOM节点,如创建树节点等。如果用于创建DOM节点的内容中包含有成对出现的尖括号,且尖括号内没有内容时,浏览器会尝试按HTML标准去解释。若它是合法的HTML标记,刚浏览器会显示成相应的HTML元素,否则浏览器将忽略并过滤掉这对尖括号及其内的内容,并且不会显示出来。

‘:单引号。(1)可能会引起执行SQL语句或存储过程的执行出错。(2)返回给前台页面的数据中,一般是使用一对单引号引起来的内容作为字符串,因此如果这个字符串中包含有单引号,就会引起JavaScript语法错误。

“:双引号。JavaScript可以使用一对单引号或一对双引号作为字符串类型的标记符,由于返回给前台页面的数据中,也可能使用一对双引号引起来的内容作为字符串,因此如果这个字符串中包含有双引号,就会引起JavaScript语法错误。

\:反斜杠。返回给前台页面的数据中如果包含有反斜杠,则JavaScript会把该反斜杠及其后的一个字符当作转义字符处理。如果它是合法的转义字符,刚解释为相应的特殊字符,否则将不显示该反斜杠字符。还有一种情况,是当这个反斜杠后面刚好是一个字符串的标记符时(单引号或双引号),这时还会引起JavaScript语法错误。

(\r):回车符。返回给前台页面的数据中如果包含有回车符,则JavaScript对这些数据进行处理时,就会在该字符的位置回车了,也就是说JavaScript执行了一行没有结束符的代码,这样会引起JavaScript语法错误。

(\n):换行符。返回给前台页面的数据中如果包含有换行符,则JavaScript对这些数据进行处理时,就会在该字符的位置换行了,也就是说JavaScript执行了一行没有结束符的代码,这样会引起JavaScript语法错误。

(\t) (\v) (\f):水平制表符、垂直制表符、换页符。用户有可能把包含这样格式符的文本粘贴到前台页面中,并作为内容保存到数据。当我们从数据中把这些内容取出来显示回页面

里,有可能会引起JavaScript语法错误。但我没有这三个字符的测试验证,因此这三个特殊字符可以作为保留字符暂不处理。

二、处理流程

以下将结合《特殊字符处理流程图.vsd》一步步进行说明:

1.发送数据

(1)用户在页面上输入包含有特殊字符的内容,以测试整个特殊字符的处理方法是否可行。

用户现在输入的内容为1.0

(2)当用户要把内容1.0保存时,需要在拼凑XML前对内容1.0进行R1转换,转换结果为

1.1,以保证XML的元素内容不会引起XML处理出错,拼凑后的XML结果为1.2。然后

把1.2的内容发送给后台处理页面

(3)从后台页面收到1.2以后,一直到dblogic.dll进行业务逻辑处理前,是不用对1.2这些内容进行解释处理的,所以这个过程没有对1.2进行任何转义替换

(4)dblogic.dll要进行业务逻辑处理时,会先把收到的XML转换成DataSet,这个转换过程中,C#会自动进行C1转换。然后把转换后的内容在为存储过程的实参或SQL语句的内容执行前,要进行R2转换成1.3以保证数据成功保存到数据库时为1.4

(5)现在可以看到,用户在界面输入的内容,跟最终保存到数据库里的内容是完全一致的2.接收数据

(1)为响应用户请求,数据库返回数据2.0

(2)dblogic.dll从数据库取得的数据类型是DataSet,然后在转换成XML的过程,C#会自动进行C2转换,转换结果为2.1

(3)dblogic.dll返回一直到后台页面,也是不会对2.1进行解释处理的,所以这个过程也不用对2.1进行任何转义替换

(4)后台页面在收到返回的数据后,会把XML先转换成DataSet,在这个过程中C#会自动进行C3转换;然后再根据DataSet内容拼凑成JSON对象字符串之前,要进行R3转换,且要求把一个反斜杠变成两个反斜杠这个转换必须在R3的其它字符转换之前进行,转换结果为2.2

(5)后台页面把根据请求把2.2拼凑成JSON对象字符串2.3返回给发送请求的前台页面(6)前台页面在收到返回的数据字符串后,要么直接保存到客户端的缓存文件中,以供下次进行相同的请求时从本地缓存文件取得数据2.3;要么把收到的JSON对象字符串转换成JSON对象2.4,再显示到页面上

(7)当需要从客户端缓存文件中取得数据显示到页面上时,是从缓存文件中取得2.3,然后转换成JSON对象2.4,再显示到页面上

3.由上面的分析得知,不管数据是用户输入再显示到页面上,还是数据原来就是数据库里的

旧数据,用户输入的数据1.0、数据库中保存的数据1.4/2.0、最终显示回页面上的数据

2.5.1这三个点上的数据是一致的,也就达到了用户输入特殊字符后保存再取回来是一致

的效果了,同时也解决了数据库中原有的旧数据库中包含有的特殊字符也可以正常到页面上的效果。

三、页面显示内容还存在的问题

用户在页面输入1.0然后再取回来2.5.1,这两个内容是一样的,但当我们把2.4的内容显示到页面上时,这里会出现两种情况:

1.用户输入的内容显示回普通控件上,这种显示方式是没有问题的,结果是

2.5.1,如下图

所示:

相关文档
最新文档