字符串中的不可見字符應該如何清除?


在我的工作中,經常要做數據的導入導出,包括在程序上和直接在數據庫上操作。由於客戶提供的數據千差萬別,很可能包含大量特殊的不可見的字符,如果直接導入到數據庫中,可能會導致應用程序出現問題,或者數據庫查詢時出現意想不到的結果。這時,需要在導入過程中,把這些“雜質”先過濾掉,再導入到數據庫中。當然也可以在數據庫中操作,這就視實際情況而定了。

 

首先,如何在找到這些不可見的字符呢?用眼睛肯定是不行的,復制這些字符放到判斷條件上?行不通。這時,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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM