控件中国网现已改版,您看到的是老版本网站的镜像,系统正在为您跳转到新网站首页,请稍候.......
中国最专业的商业控件资讯网产品咨询电话:023-67870900 023-67871946
产品咨询EMAIL:SALES@COMPONENTCN.COM

Javascript unescape的 SQL SERVER实现

作者:未知 出处:cnblog 2013年03月15日 阅读:

 Javascript unescape的 SQL SERVER实现 

 
  之前为了处理用户输入的特殊字符,我将输入类容使用javascript escape方法转义后保存到DB,后来觉的不太合适,需要写一段SQL更新旧资料。找了相关资料,Sql Server 有函数
 
可以将数值转换为字符,例如0x20转换为空格,'0x20'字符串呢,却不行,所以先将'0x20'转换为数值即可;当然,我们可以将旧资料使用C#或Javascript的unescape装换后再保存到
 
DB。
 
  javascript escape的原理: 所有空格、标点、重音符号以及其他非 ASCII 字符都用 %xx 或 %uxxxx(字符值大于 255) 编码代替,其中 xx,xxxx为该字符的十六进制数。例如
 
,空格-- "%20" ,单引号(’)---%u2019
 
  看下面的SQL代码,主要运用SQL SERVER 的字符串函数、NCHAR()、UNICODE()、POWER()等函数
 
  其中 (CHARINDEX('2','0123456789ABCDEF')-1)*POWER(16,3) 是十六进制转十进制算法。比如,'122AB',A的十进制值 = 10*16^1
 
 
declare @tenNum INT=0
-- %u2013
SET @tenNum     = (CHARINDEX('2','0123456789ABCDEF')-1)*POWER(16,3)
                + (CHARINDEX('0','0123456789ABCDEF')-1)*POWER(16,2)
                + (CHARINDEX('1','0123456789ABCDEF')-1)*POWER(16,1)
                + (CHARINDEX('3','0123456789ABCDEF')-1)*POWER(16,0)
 
--看懂此语句,基本上就没问题,主要是要清楚函数功能               
SELECT '%u2013' AS 'ESCAPE字符串'
,NCHAR(0x2013)    AS '十六进制'
,@tenNum        AS '十进制值'
,NCHAR(@tenNum) AS '字符'
,UNICODE('–')    AS '万国码'
 
 DECLARE 
      @REMARK NVARCHAR(MAX)='forward%20with%20this%20project%u2013%20in%20the%20near%20future%u2026%20%28abcd%20ef%20aaa%20efg%
 
20or%20hij%29%20sfsdaf'
     ,@TEMP NVARCHAR(10) = ''
     ,@tenNum INT
     ,@1c CHAR(1)
     ,@2c CHAR(1)
     ,@3c CHAR(1)
     ,@4c CHAR(1)
     ,@i BIGINT = 1
     
     SET @REMARK = RTRIM(LTRIM(ISNULL(@REMARK,'')))
     
     IF LEN(@REMARK) > 0
     BEGIN
         
         SET @i = 1
         --处理%xx格式
         WHILE PATINDEX('%[%][0-9A-F][0-9A-F]%',@REMARK) > 0 AND @i < 5
         BEGIN
             
             SET @TEMP = SUBSTRING(@REMARK,PATINDEX('%[%][0-9A-F][0-9A-F]%',@REMARK),3)
             
             SELECT @1c = SUBSTRING(@TEMP,2,1),@2c = SUBSTRING(@TEMP,3,1)
             SET @tenNum = (CHARINDEX(@1c,'0123456789ABCDEF')-1)*POWER(16,1)
                         + (CHARINDEX(@2c,'0123456789ABCDEF')-1)*POWER(16,0)--十六进制转十进制
             IF  NCHAR(@tenNum) IS NOT NULL             
                 SET @REMARK = REPLACE(@REMARK,@TEMP,NCHAR(@tenNum))                            
             ELSE
                 SET @i+=1
         END
 
         SET @i = 1
         
         --处理%xxxx格式
         WHILE PATINDEX('%[%][U][0-9A-F][0-9A-F][0-9A-F][0-9A-F]%',@REMARK) > 0 AND @i < 5
         BEGIN
 
             PRINT PATINDEX('%[%][U][0-9A-F][0-9A-F][0-9A-F][0-9A-F]%',@REMARK)
             SET @TEMP = SUBSTRING(@REMARK,PATINDEX('%[%][U][0-9A-F][0-9A-F][0-9A-F][0-9A-F]%',@REMARK),6)            
 
             SELECT @1c = SUBSTRING(@TEMP,3,1),@2c = SUBSTRING(@TEMP,4,1)
                   ,@3c = SUBSTRING(@TEMP,5,1),@4c = SUBSTRING(@TEMP,6,1)                  
             SET @tenNum = (CHARINDEX(@1c,'0123456789ABCDEF')-1)*POWER(16,3)
                         + (CHARINDEX(@2c,'0123456789ABCDEF')-1)*POWER(16,2)
                         + (CHARINDEX(@3c,'0123456789ABCDEF')-1)*POWER(16,1)
                         + (CHARINDEX(@4c,'0123456789ABCDEF')-1)*POWER(16,0)    
             SELECT @1c,@2c,@3c,@4c            
                                             
             IF  NCHAR(@tenNum) IS NOT NULL             
                 SET @REMARK = REPLACE(@REMARK,@TEMP,NCHAR(@tenNum))                    
             ELSE
                 SET @i+=1
         END    
     END
 
 SELECT  @REMARK 'result'

热推产品

  • ActiveReport... 强大的.NET报表设计、浏览、打印、转换控件,可以同时用于WindowsForms谀坔攀戀Forms平台下......
  • AnyChart AnyChart使你可以创建出绚丽的交互式的Flash和HTML5的图表和仪表控件。可以用于仪表盘的创......
首页 | 新闻中心 | 产品中心 | 技术文档 | 友情连接 | 关于磐岩 | 技术支持中心 | 联系我们 | 帮助中心 Copyright-2006 ComponentCN.com all rights reserved.重庆磐岩科技有限公司(控件中国网) 版权所有 电话:023 - 67870900 传真:023 - 67870270 产品咨询:sales@componentcn.com 渝ICP备12000264号 法律顾问:元炳律师事务所 重庆市江北区塔坪36号维丰创意绿苑A座28-5 邮编:400020
在线客服
在线客服系统
在线客服
在线客服系统