博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL 将URL编码转汉字!
阅读量:5164 次
发布时间:2019-06-13

本文共 3252 字,大约阅读时间需要 10 分钟。

原文:

-- =============================================-- 作    者: ruijc-- 描    述: 将Url编码转明文字符串-- =============================================CREATE FUNCTION FN_URLDecode( @Str VARCHAR(8000)--已经编码的字符串)RETURNS VARCHAR(8000)ASBEGIN  DECLARE @Position  INT;          --'%'字符所在位置  DECLARE @Chr       CHAR(16);     --字符常量  DECLARE @Pattern   CHAR(21);  DECLARE @ParseStr  VARCHAR(8000);--解码后的字符串  DECLARE @Hex		 UNIQUEIDENTIFIER;--定义16进制模板,因为GUID方便转为BYTE  DECLARE @CurrWord	 INT		;--当前字  DECLARE @BitsCount INT        ;--当前解码位数  DECLARE @HightByte TINYINT;--高位字节  DECLARE @LowByte   TINYINT;--低位字节    /****************变量初始化***********************/  SET     @Chr = '0123456789abcdef';  SET     @Pattern = '%[%][a-f0-9][a-f0-9]%';  SET     @ParseStr=@Str;  SET     @Hex= '00000000-0000-0000-0000-000000000000';  SET     @CurrWord=0;  SET     @BitsCount=0;  SET     @HightByte=0;  SET     @LowByte=0;    IF (@Str IS NOT NULL OR @Str<>'')   BEGIN     SET    @Position = PATINDEX(@Pattern, @ParseStr);--取得第一个'%'所在的位置     WHILE @Position>0      BEGIN        SET @Hex=STUFF(@Hex,7,2,LEFT(RIGHT(@ParseStr,len(@ParseStr) - @Position),2));        SET @HightByte=CAST(CAST(@Hex AS BINARY(1)) AS INT);                IF (@HightByte & 127=@HightByte)         BEGIN--ASCII码直接转为UTF-8或UTF-16           SET @CurrWord=@HightByte;           SET @BitsCount=1;         END                 IF (@HightByte & 192=192)         BEGIN--Unicode编码           SET @CurrWord=@HightByte & 31 ;           SET @BitsCount=2;         END        IF (@HightByte & 224=224)         BEGIN--UTF-8编码			SET	@CurrWord = @HightByte & 15			SET @BitsCount = 3	         END        IF (@HightByte & 240=240)         BEGIN--UTF-16编码			SET	@CurrWord = @HightByte & 7			SET @BitsCount = 4	         END        DECLARE @Index INT;                DECLARE @NEWCHAR NVARCHAR(2);        SET @Index=1;        SET @NEWCHAR='';        WHILE @Index<@BitsCount         BEGIN              IF (LEN(@ParseStr)-@Position-3*@Index)<0               BEGIN                   SET @ParseStr=@Str ;                      SET @Position=0;                   BREAK;                             END			SET @NEWCHAR = LEFT(RIGHT(@ParseStr,LEN(@ParseStr) - @Position - 3* @Index),2);	              --如果没有16进制编码则中断外层WHILE			IF @NEWCHAR NOT LIKE '[a-f0-9][a-f0-9]'			 BEGIN				SET @ParseStr = @Str				SET @Position=0;--中断外层WHILE				BREAK;			 END 				SET @Hex = STUFF(@Hex, 7, 2, @NEWCHAR)					SET @LowByte = CAST(CAST(@Hex AS BINARY(1)) AS INT);			IF @LowByte&192=192			BEGIN				SET @ParseStr = @Str				SET @Position=0;--中断外层WHILE				BREAK;			END 						SET @CurrWord = (@CurrWord * 64) | (@LowByte & 63)							SET @Index =@Index+ 1						  			                      END                                   		 IF @BitsCount > 1                     SET @ParseStr = STUFF(@ParseStr, @Position, 3*(@BitsCount), NCHAR(@CurrWord))		 ELSE 		  BEGIN			set @ParseStr = STUFF(@ParseStr, @Position, 2, NCHAR(@CurrWord))			set @ParseStr = STUFF(@ParseStr, @Position+1, 1, N'')				  END		----取得下一个'%'所在的位置        SET  @Position = PATINDEX(@Pattern, @ParseStr);      END   END   RETURN @ParseStr;ENDGOSELECT dbo.FN_URLDecode('%E4%BD%A0%E6%98%AF%E5%93%AA%E4%B8%AA')
posted on
2015-02-15 18:09 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/lonelyxmas/p/4293344.html

你可能感兴趣的文章
AQS(AbstractQueuedSynchronizer)
查看>>
Ubuntu boot空间不足解决方法
查看>>
Linux基础命令---iostat显示设备状态
查看>>
java例程练习(多线程[join()方法])
查看>>
20155337 2016-2017-2 《Java程序设计》第三周学习总结
查看>>
覆盖equals时请遵守通用约定
查看>>
memcached的安装和使用
查看>>
inner join 各种连接 SQL语句
查看>>
经验人士的IOS APP设计心得
查看>>
teleport使用说明
查看>>
IdentityServer4 登录使用数据库
查看>>
从PDF中提取信息----PDFMiner
查看>>
极简Node教程-七天从小白变大神(一:你需要Express)
查看>>
Windows环境配置Apache+Mysql+PHP
查看>>
内网端口映射详解(花生壳)
查看>>
回调和回显有什么区别?
查看>>
业务逻辑与数据解耦+单元测试
查看>>
mysql数据备份
查看>>
Ural Timus 1009 K-based Numbers (dp+矩阵快速幂+快速乘)
查看>>
[经验总结] 从其它sheet页引用数据生成图表时没有图例的解决办法
查看>>