/*************************
作者:zonelive
--对串调用:select dbo.f_chge_utf8('我是一个中国人')
结果:
%3F%3F%3F%3F%3F%3F%3F
--对单字:select dbo.f_utf8('中')
结果:
%3F
*************************/
create function f_chge_utf8(@str nvarchar(4000))
returns nvarchar(4000)
as
begin
declare @s nvarchar(4000),@i int
set @s=''
set @i=1
--对传入的字符串逐字的处理
while @i<=len(@str)
begin
set @s=@s+dbo.f_utf8(substring(@str,@i,1))
set @i=@i+1
end
return @s
end
GO
create function f_utf8(@str nvarchar(20))
returns nvarchar(20)
as
begin
declare @ss bigint,@temp nvarchar(4000),@temp2 nvarchar(4000)
set @ss=unicode(@str)
if @ss<=127 begin
--转化二进制
set @temp=dbo.f_int2binary(@ss)
--转化16进制
set @str='%'+dbo.f_binary2hex(@temp)
goto go_end
end
if @ss>127 and @ss<=2047 begin
--转化二进制
set @temp=dbo.f_int2binary(@ss)
--从右处理6位
set @temp2='10'+right(@temp,6)
set @str='%'+dbo.f_binary2hex(@temp2)
--再处理6位
set @temp2=left(@temp,len(@temp)-6)
set @temp2='110'+right('00000'+@temp2,5) --5位不够补0
set @str='%'+dbo.f_binary2hex(@temp2)+@str
goto go_end
end
if @ss>2047 and @ss<=65535 begin
--转化二进制
set @temp=dbo.f_int2binary(@ss)
--从右处理6位
set @temp2='10'+right(@temp,6)
set @str='%'+dbo.f_binary2hex(@temp2)
--再处理6位
set @temp=left(@temp,len(@temp)-6) --去掉右6位
set @temp2='10'+right(@temp,6)
set @str='%'+dbo.f_binary2hex(@temp2)+@str
--再处理6位
set @temp2=left(@temp,len(@temp)-6)
set @temp2='1110'+right('0000'+@temp2,4) --4位不够补0
set @str='%'+dbo.f_binary2hex(@temp2)+@str
goto go_end
end
if @ss>65535 and @ss<=2097151 begin
--转化二进制
set @temp=dbo.f_int2binary(@ss)
--从右处理6位
set @temp2='10'+right(@temp,6)
set @str='%'+dbo.f_binary2hex(@temp2)
--再处理6位
set @temp=left(@temp,len(@temp)-6) --去掉右6位
set @temp2='10'+right(@temp,6)
set @str='%'+dbo.f_binary2hex(@temp2)+@str
--再处理6位
set @temp=left(@temp,len(@temp)-6) --去掉右6位
set @temp2='10'+right(@temp,6)
set @str='%'+dbo.f_binary2hex(@temp2)+@str
--再处理6位
set @temp2=left(@temp,len(@temp)-6)
set @temp2='11110'+right('000'+@temp2,3) --3位不够补0
set @str='%'+dbo.f_binary2hex(@temp2)+@str
goto go_end
end
if @ss>2097151 and @ss<=67108863 begin
--转化二进制
set @temp=dbo.f_int2binary(@ss)
--从右处理6位
set @temp2='10'+right(@temp,6)
set @str='%'+dbo.f_binary2hex(@temp2)
--再处理6位
set @temp=left(@temp,len(@temp)-6) --去掉右6位
set @temp2='10'+right(@temp,6)
set @str='%'+dbo.f_binary2hex(@temp2)+@str
--再处理6位
set @temp=left(@temp,len(@temp)-6) --去掉右6位
set @temp2='10'+right(@temp,6)
set @str='%'+dbo.f_binary2hex(@temp2)+@str
--再处理6位
set @temp=left(@temp,len(@temp)-6) --去掉右6位
set @temp2='10'+right(@temp,6)
set @str='%'+dbo.f_binary2hex(@temp2)+@str
--再处理6位
set @temp2=left(@temp,len(@temp)-6)
set @temp2='111110'+right('00'+@temp2,2) --2位不够补0
set @str='%'+dbo.f_binary2hex(@temp2)+@str
goto go_end
end
if @ss>67108863 and @ss<=2147483647 begin
--转化二进制
set @temp=dbo.f_int2binary(@ss)
--从右处理6位
set @temp2='10'+right(@temp,6)
set @str='%'+dbo.f_binary2hex(@temp2)
--再处理6位
set @temp=left(@temp,len(@temp)-6) --去掉右6位
set @temp2='10'+right(@temp,6)
set @str='%'+dbo.f_binary2hex(@temp2)+@str
--再处理6位
set @temp=left(@temp,len(@temp)-6) --去掉右6位
set @temp2='10'+right(@temp,6)
set @str='%'+dbo.f_binary2hex(@temp2)+@str
--再处理6位
set @temp=left(@temp,len(@temp)-6) --去掉右6位
set @temp2='10'+right(@temp,6)
set @str='%'+dbo.f_binary2hex(@temp2)+@str
--再处理6位
set @temp=left(@temp,len(@temp)-6) --去掉右6位
set @temp2='10'+right(@temp,6)
set @str='%'+dbo.f_binary2hex(@temp2)+@str
--再处理6位
set @temp2=left(@temp,len(@temp)-6)
set @temp2='1111110'+right('0'+@temp2,2) --1位不够补0
set @str='%'+dbo.f_binary2hex(@temp2)+@str
goto go_end
end
go_end:
return @str
end
create function f_int2binary(@ss int)
returns varchar(8000)
as
--十进制转二进制函数
--调用select dbo.f_int2binary(121)
begin
declare @m int,@str varchar(8000),@n int
set @str=''
while 1=1
begin
set @m=@ss/2
set @n=@ss%2
set @str=cast(@n as varchar(20))+@str
if @m=0 break
set @ss=@m
end
return @str
end
create function f_binary2hex(@str varchar(8000))
returns varchar(8000)
as
--二进制转16进制函数
--调用select dbo.f_binary2hex('1101011000110011011110')
begin
declare @s varchar(4),@i int,@temp varchar(8000)
set @i=1
set @temp=''
if 4-len(@str)%4=1 set @str='0'+@str
else if 4-len(@str)%4=2 set @str='00'+@str
else if 4-len(@str)%4=3 set @str='000'+@str
while @i<len(@str)
begin
set @s=substring(@str,@i,4)
set @s=replace(@s,'0000','0')
set @s=replace(@s,'0001','1')
set @s=replace(@s,'0010','2')
set @s=replace(@s,'0011','3')
set @s=replace(@s,'0100','4')
set @s=replace(@s,'0101','5')
set @s=replace(@s,'0110','6')
set @s=replace(@s,'0111','7')
set @s=replace(@s,'1000','8')
set @s=replace(@s,'1001','9')
set @s=replace(@s,'1010','A')
set @s=replace(@s,'1011','B')
set @s=replace(@s,'1100','C')
set @s=replace(@s,'1101','D')
set @s=replace(@s,'1110','E')
set @s=replace(@s,'1111','F')
set @temp=@temp+@s
set @i=@i+4
end
return @temp
end