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

2022-02-14 17:43:50 字數 2817 閱讀 4291

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

首先,如何在找到這些不可見的字元呢?用眼睛肯定是不行的,複製這些字元放到判斷條件上?行不通。這時,ascii(american standard code for information interchange),即美國標準資訊交換**幫上大忙。

計算機上所有字元都是在ascii基礎上進行擴充套件編碼的,比如英文本元「a」的十進位制編碼是65,中文的「中」字的十進位制編碼是20013。關於ascii編碼,計算機字符集等知識,可上網或查閱相關資料,這裡不再贅述。不過關於資料庫的字符集,也是乙個非常值得**的話題,在以後的文章中再與大家分享下自己的經驗。

從上面的ascii碼值表中得知,十進位制的0至31和127這33個編碼是不可見的特殊字元(控制符)。所以,只要想方法把這些字元替換掉即可。以下是我寫的函式。如果您有更好的方法,請多多指教哈。

1

ifobject_id(n'

fn_trim_invisible_code

') is

notnull

2begin

3drop

function

fn_trim_invisible_code

4end5go

678/*

去掉字串的不可見字元,包括去掉字串兩邊的空格*/9

create

function fn_trim_invisible_code(@str

nvarchar(max)='')

10returns

nvarchar(max)11

as12

begin

13declare

@char

nvarchar(max)14

declare

@iint

15set

@char=''

16set@i=

11718while

@i<=

len(@str)19

begin

20set

@char

=@char

+case

when

unicode(substring(@str,@i,1)) <=

31or

unicode(substring(@str,@i,1)) =

12721

then

''22

else

substring(@str,@i,1

) 23

end24

set@i=@i

+125end

26return

rtrim(ltrim(@char

))27

end

1

ifobject_id(n'

fn_trim_invisible_code

') is

notnull

2begin

3drop

function

fn_trim_invisible_code

4end5go

678/*

去掉字串的不可見字元,包括去掉字串兩邊的空格*/9

/*如果字串中間的空格也要去掉,把@ucode<=31修改為<=32即可

*/10

create

function fn_trim_invisible_code(@str

nvarchar(max)='')

11returns

nvarchar(max)12

as13

begin

14declare

@char

nvarchar(max)15

declare

@ucode

int16

declare

@str2

nvarchar(max)17

declare

@cnvarchar(1)18

declare

@iint

19set

@char=''

20set

@str2

=rtrim(ltrim(@str

))21

set@i=1

2223

while

@i<=

len(@str2)24

begin

25set@c=

substring(@str2,@i,1)26

set@ucode

=unicode(@c

)

27set

@char

=@char

+case

when

@ucode

<=

31or

@ucode

=127

then

''else

@cend

28set@i=

@i+129

end30

31return (@char)32

end33

go

字串中的不可見字元

最近用datax匯入資料到pipeline的時候,碰到乙個報髒資料的錯誤,檢查後發現字串包含 u0000和 u007f,就以為是這兩個unicode字元搞的鬼,寫了正則 unicode.replaceall s u007f s 來匹配,還是會報髒資料,原始的字串是下面這個樣子的 12345678 u...

EXCEL中的神秘的不可見字元

因處理資料,需要把單位名稱前的空格字元去年,結果只有幾條記錄的去掉了,大部分記錄的單位名稱欄位前的空格沒有去掉。先看下圖 第1列為原資料,第2列為應用公式trim去空格,第3列用substitue函式替換空格 選中a列第3行 山東路 前面的空格 進行替換操作,把這些未知的字元替換成b 黃色記錄的4處...

字串 如何刪除字串中重複的字元

刪除字串中重複的字元,例如,good 去掉重複的字串後就變成 god 第一種方法 蠻力法 最簡單的方法就是把這個字串看作是乙個字元陣列,對該陣列使用雙重迴圈進行遍歷,如果發現有重複的字元,就把該字元置為 0 最後再把這個字元陣列中所有的 0 去掉,此時得到的字串就是刪除重複字元後的目標字串。第二種方...