全角/半角转换

来源:互联网 发布:淘宝上的秒杀是假的 编辑:程序博客网 时间:2024/05/20 12:22
 
if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N'[dbo].[f_convert]')   and   xtype   in   (N'FN',   N'IF',   N'TF'))     drop   function   [dbo].[f_convert]     GO         /*--全角/半角转换         转换说明     全角字符从的unicode编码从65281~65374     半角字符从的unicode编码从       33~126     空格比较特殊,全角为   12288,半角为   32     而且除空格外,全角/半角按unicode编码排序在顺序上是对应的     所以可以直接通过用+-法来处理非空格数据,对空格单独处理     like的时候,指定排序规则   COLLATE   Latin1_General_BIN     是保证字符顺序按unicode编码排序     (此函数部分思路参考了CSDN上大力的转换函数)     --邹建   2005.01(引用请保留此信息)--*/         /*--调用示例         declare   @s1   varchar(8000)     select   @s1='中    2-3456a78STUVabn中国opwxyz'     select   dbo.f_convert(@s1,0),dbo.f_convert(@s1,1)     --*/     CREATE   FUNCTION   f_Convert(     @str   NVARCHAR(4000),   --要转换的字符串     @flag   bit                         --转换标志,0转换成半角,1转换成全角     )RETURNS   nvarchar(4000)     AS     BEGIN     DECLARE   @pat   nvarchar(8),@step   int,@i   int,@spc   int     IF   @flag=0     SELECT   @pat=N'%[!-~]%',@step=-65248,     @str=REPLACE(@str,N' ',N'   ')     ELSE     SELECT   @pat=N'%[!-~]%',@step=65248,     @str=REPLACE(@str,N'   ',N' ')     SET   @i=PATINDEX(@pat   COLLATE   LATIN1_GENERAL_BIN,@str)     WHILE   @i>0     SELECT   @str=REPLACE(@str,     SUBSTRING(@str,@i,1),     NCHAR(UNICODE(SUBSTRING(@str,@i,1))+@step))     ,@i=PATINDEX(@pat   COLLATE   LATIN1_GENERAL_BIN,@str)     RETURN(@str)     END     GO  

原创粉丝点击