UFN_DECODEURL
Return
Return Type |
---|
nvarchar(4000) |
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@URL | nvarchar(4000) | IN |
Definition
Copy
CREATE function [dbo].[UFN_DECODEURL] (@URL nvarchar(4000))
returns nvarchar(4000)
as
begin
declare @POSITION int,
@BASE char(16),
@HIGH tinyint,
@LOW tinyint,
@PATTERN char(21),
@BYTE1VALUE int,
@SURROGATEHIGN int,
@SURROGATELOW int
select @PATTERN = '%[%][0-9a-f][0-9a-f]%',
@POSITION = Patindex(@PATTERN, @URL)
while @POSITION > 0
begin
select @HIGH = Ascii(Upper(Substring(@URL, @POSITION + 1, 1))) - 48,
@LOW = Ascii(Upper(Substring(@URL, @POSITION + 2, 1))) - 48,
@HIGH = @HIGH / 17 * 10 + @HIGH % 17,
@LOW = @LOW / 17 * 10 + @LOW % 17,
@BYTE1VALUE = 16 * @HIGH + @LOW
if @BYTE1VALUE < 128 --1-byte UTF-8
select @URL = Stuff(@URL, @POSITION, 3, Nchar(@BYTE1VALUE)),
@POSITION = Patindex(@PATTERN, @URL)
else if @BYTE1VALUE >= 192
and @BYTE1VALUE < 224
and @POSITION > 0 --2-byte UTF-8
begin
select @BYTE1VALUE = ( @BYTE1VALUE & ( Power(2, 5) - 1 ) ) *
Power(2
,
6),
@URL = Stuff(@URL, @POSITION, 3, ''),
@POSITION = Patindex(@PATTERN, @URL)
if @POSITION > 0
select @HIGH = Ascii(Upper(Substring(@URL, @POSITION + 1, 1)
))
- 48,
@LOW = Ascii(Upper(Substring(@URL, @POSITION + 2, 1))
)
- 48
,
@HIGH = @HIGH / 17 * 10 + @HIGH % 17,
@LOW = @LOW / 17 * 10 + @LOW % 17,
@BYTE1VALUE = @BYTE1VALUE + ( ( 16 * @HIGH + @LOW ) &
( Power(2, 6) - 1 )
),
@URL = Stuff(@URL, @POSITION, 3, Nchar(@BYTE1VALUE)),
@POSITION = Patindex(@PATTERN, @URL)
end
else if @BYTE1VALUE >= 224
and @BYTE1VALUE < 240
and @POSITION > 0 --3-byte UTF-8
begin
select @BYTE1VALUE = ( @BYTE1VALUE & ( Power(2, 4) - 1 ) ) *
Power(2
,
12),
@URL = Stuff(@URL, @POSITION, 3, ''),
@POSITION = Patindex(@PATTERN, @URL)
if @POSITION > 0
select @HIGH = Ascii(Upper(Substring(@URL, @POSITION + 1, 1)
))
- 48,
@LOW = Ascii(Upper(Substring(@URL, @POSITION + 2, 1))
)
- 48
,
@HIGH = @HIGH / 17 * 10 + @HIGH % 17,
@LOW = @LOW / 17 * 10 + @LOW % 17,
@BYTE1VALUE = @BYTE1VALUE + ( ( 16 * @HIGH + @LOW ) &
( Power(2, 6) - 1 )
) *
Power(2, 6),
@URL = Stuff(@URL, @POSITION, 3, ''),
@POSITION = Patindex(@PATTERN, @URL)
if @POSITION > 0
select @HIGH = Ascii(Upper(Substring(@URL, @POSITION + 1, 1)
))
- 48,
@LOW = Ascii(Upper(Substring(@URL, @POSITION + 2, 1))
)
- 48
,
@HIGH = @HIGH / 17 * 10 + @HIGH % 17,
@LOW = @LOW / 17 * 10 + @LOW % 17,
@BYTE1VALUE = @BYTE1VALUE + ( ( 16 * @HIGH + @LOW ) &
( Power(2, 6) - 1 )
),
@URL = Stuff(@URL, @POSITION, 3, Nchar(@BYTE1VALUE)),
@POSITION = Patindex(@PATTERN, @URL)
end
else if @BYTE1VALUE >= 240
and @POSITION > 0 --4-byte UTF-8
begin
select @BYTE1VALUE = ( @BYTE1VALUE & ( Power(2, 3) - 1 ) ) *
Power(2
,
18),
@URL = Stuff(@URL, @POSITION, 3, ''),
@POSITION = Patindex(@PATTERN, @URL)
if @POSITION > 0
select @HIGH = Ascii(Upper(Substring(@URL, @POSITION + 1, 1)
))
- 48,
@LOW = Ascii(Upper(Substring(@URL, @POSITION + 2, 1))
)
- 48
,
@HIGH = @HIGH / 17 * 10 + @HIGH % 17,
@LOW = @LOW / 17 * 10 + @LOW % 17,
@BYTE1VALUE = @BYTE1VALUE + ( ( 16 * @HIGH + @LOW ) &
( Power(2, 6) - 1 )
) *
Power(2, 12),
@URL = Stuff(@URL, @POSITION, 3, ''),
@POSITION = Patindex(@PATTERN, @URL)
if @POSITION > 0
select @HIGH = Ascii(Upper(Substring(@URL, @POSITION + 1, 1)
))
- 48,
@LOW = Ascii(Upper(Substring(@URL, @POSITION + 2, 1))
)
- 48
,
@HIGH = @HIGH / 17 * 10 + @HIGH % 17,
@LOW = @LOW / 17 * 10 + @LOW % 17,
@BYTE1VALUE = @BYTE1VALUE + ( ( 16 * @HIGH + @LOW ) &
( Power(2, 6) - 1 )
) *
Power(2, 6),
@URL = Stuff(@URL, @POSITION, 3, ''),
@POSITION = Patindex(@PATTERN, @URL)
if @POSITION > 0
begin
select @HIGH = Ascii(Upper(Substring(@URL, @POSITION + 1
,
1)))
- 48,
@LOW = Ascii(Upper(Substring(@URL, @POSITION + 2,
1
)))
- 48,
@HIGH = @HIGH / 17 * 10 + @HIGH % 17,
@LOW = @LOW / 17 * 10 + @LOW % 17,
@BYTE1VALUE = @BYTE1VALUE + ( ( 16 * @HIGH + @LOW
)
& (
Power(2, 6) - 1 )
)
select @SURROGATEHIGN = ( ( @BYTE1VALUE - Power(16, 4) )
&
(
Power(2, 20) - 1 ) ) /
Power(2, 10) + 13 *
Power(16, 3) +
8
*
Power(16, 2),
@SURROGATELOW = ( ( @BYTE1VALUE - Power(16, 4) )
&
( Power(2, 10) - 1 ) )
+ 13 *
Power(16, 3) +
12 * Power(16, 2),
@URL = Stuff(@URL, @POSITION, 3, Nchar(
@SURROGATEHIGN)
+ Nchar(
@SURROGATELOW)
),
@POSITION = Patindex(@PATTERN, @URL)
end
end
end
return Replace(@URL, '+', ' ')
end