字符串中的不可见字符应该如何清除?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串中的不可见字符应该如何清除?相关的知识,希望对你有一定的参考价值。

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

 

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

 技术分享

Fiugre-1: ASCII表(此图片来源于百度)

 

技术分享

Figure-2: ASCII表2

 

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

 

从上面的图片ASCII码值表中得知,十进制的0至31和127这33个编码是不可见的特殊字符(控制符)。所以,只要想方法把这些字符替换掉即可。以下为实现的函数。

IF OBJECT_ID(N‘ufn_trim_invisible_code‘) IS NOT NULL
BEGIN
    DROP FUNCTION ufn_trim_invisible_code
END
GO
/*去掉字符串的不可见字符,包括去掉字符串两边的空格*/
/*如果字符串中间的空格也要去掉,把@ucode<=31修改为<=32即可*/
CREATE FUNCTION ufn_trim_invisible_code(@str NVARCHAR(MAX)=‘‘)
RETURNS NVARCHAR(MAX)
AS
BEGIN
DECLARE @char NVARCHAR(MAX)
DECLARE @ucode INT
DECLARE @str2 NVARCHAR(MAX)
DECLARE @c NVARCHAR(1)
DECLARE @i INT
SET @char = ‘‘ 
SET @str2 = RTRIM(LTRIM(@str))
SET @i = 1
WHILE @i <= LEN(@str2)
BEGIN    
    SET @c = SUBSTRING(@str2,@i,1)
    SET @ucode = UNICODE(@c)   
    SET @char = @char + CASE WHEN @ucode <= 31 OR @ucode = 127 THEN ‘‘ ELSE @c END
    SET @i = @i + 1
END
RETURN (@char)
END
GO


本文出自 “FishParadise” 博客,请务必保留此出处http://fishparadise.blog.51cto.com/11284420/1751001

以上是关于字符串中的不可见字符应该如何清除?的主要内容,如果未能解决你的问题,请参考以下文章

C#移除字符串中的不可见Unicode字符

片段后面的不可见布局被点击:

影响字母排序的不可见 Unicode 字符

如何拆分字符串 C# 并忽略字符串中的不完整单词

如何从集合视图中的不可见单元格中删除自定义视图

如何在导航抽屉活动模板中的片段之间传递字符串变量