自己写的一个utf-8编码函数(SQLSEVER版)

/*************************
作者: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值