zoukankan      html  css  js  c++  java
  • 字符串中的不可见字符应该如何清除?

    在我的工作中,经常要做数据的导入导出,包括在程序上和直接在数据库上操作。由于客户提供的数据千差万别,很可能包含大量特殊的不可见的字符,如果直接导入到数据库中,可能会导致应用程序出现问题,或者数据库查询时出现意想不到的结果。这时,需要在导入过程中,把这些“杂质”先过滤掉,再导入到数据库中。当然也可以在数据库中操作,这就视实际情况而定了。

    首先,如何在找到这些不可见的字符呢?用眼睛肯定是不行的,复制这些字符放到判断条件上?行不通。这时,ASCII(American Standard Code for Information Interchange),即美国标准信息交换代码帮上大忙。

     

    (此图片来源于百度)

    计算机上所有字符都是在ASCII基础上进行扩展编码的,比如英文字符“A”的十进制编码是65,中文的“中”字的十进制编码是20013。关于ASCII编码,计算机字符集等知识,可上网或查阅相关资料,这里不再赘述。不过关于数据库的字符集,也是一个非常值得探讨的话题,在以后的文章中再与大家分享下自己的经验。

    从上面的图片ASCII码值表中得知,十进制的0至31和127这33个编码是不可见的特殊字符(控制符)。所以,只要想方法把这些字符替换掉即可。以下是我写的函数。如果您有更好的方法,请多多指教哈。

     1 IF OBJECT_ID(N'fn_trim_invisible_code') IS NOT NULL
     2 BEGIN
     3     DROP FUNCTION fn_trim_invisible_code
     4 END
     5 GO
     6 
     7 
     8 /*去掉字符串的不可见字符,包括去掉字符串两边的空格*/
     9 CREATE FUNCTION fn_trim_invisible_code(@str NVARCHAR(MAX)='')
    10 RETURNS NVARCHAR(MAX)
    11 AS
    12 BEGIN
    13 DECLARE @char NVARCHAR(MAX)
    14 DECLARE @i INT
    15 SET @char = '' 
    16 SET @i = 1
    17 
    18 WHILE @i <= LEN(@str)
    19 BEGIN    
    20     SET @char = @char + CASE WHEN UNICODE(SUBSTRING(@str,@i,1)) <= 31 OR UNICODE(SUBSTRING(@str,@i,1)) = 127 
    21                              THEN '' 
    22                              ELSE SUBSTRING(@str,@i,1) 
    23                         END
    24     SET @i = @i + 1
    25 END
    26 RETURN RTRIM(LTRIM(@char))
    27 END

    -----------------经@剑走江湖 的提醒,重新修改了函数,减少substring使用次数,测试后性能有所提升。谢谢!-------------

     1 IF OBJECT_ID(N'fn_trim_invisible_code') IS NOT NULL
     2 BEGIN
     3     DROP FUNCTION fn_trim_invisible_code
     4 END
     5 GO
     6 
     7 
     8 /*去掉字符串的不可见字符,包括去掉字符串两边的空格*/
     9 /*如果字符串中间的空格也要去掉,把@ucode<=31修改为<=32即可*/
    10 CREATE FUNCTION fn_trim_invisible_code(@str NVARCHAR(MAX)='')
    11 RETURNS NVARCHAR(MAX)
    12 AS
    13 BEGIN
    14 DECLARE @char NVARCHAR(MAX)
    15 DECLARE @ucode INT
    16 DECLARE @str2 NVARCHAR(MAX)
    17 DECLARE @c NVARCHAR(1)
    18 DECLARE @i INT
    19 SET @char = '' 
    20 SET @str2 = RTRIM(LTRIM(@str))
    21 SET @i = 1
    22 
    23 WHILE @i <= LEN(@str2)
    24 BEGIN    
    25     SET @c = SUBSTRING(@str2,@i,1)
    26     SET @ucode = UNICODE(@c)   
    27     SET @char = @char + CASE WHEN @ucode <= 31 OR @ucode = 127 THEN '' ELSE @c END
    28     SET @i = @i + 1
    29 END
    30 
    31 RETURN (@char)
    32 END
    33 GO
  • 相关阅读:
    工业4G DTU是什么和普通DTU有什么不同
    NB-IOT基站的优势和特点
    rs485通讯模块有什么作用
    串口服务器的具体做用
    4G DTU是什么 可以应用于哪些行业?
    关于linux文件出现属性显示?????????? ? ?问题的一些解决方法
    log4j.properties配置与将异常输出到Log日志文件实例
    将字符串向hdfs中写入,出现中文乱码!
    impala操作hase、hive
    Kudu基本操作及概念
  • 原文地址:https://www.cnblogs.com/fishparadise/p/4570654.html
Copyright © 2011-2022 走看看