[转] java - 过滤ASCII码中的不可见字符, ASCII三部分, 各控制字符详解

本文介绍了ASCII码中的不可见字符,包括0x00到0x1F和127的控制字符,解释了它们的功能,如NUL、SOH、STX、ETX等,并讨论了在数据传输和文本处理中如何过滤这些字符。
摘要由CSDN通过智能技术生成

标签

PostgreSQL , java , Greenplum , 0x00 , 空字符 , NUL , 数据清洗 , 规则 , 过滤 , 非法字符


背景

原文

http://www.codeweblog.com/sqlserve%E5%88%B0pg%E8%BF%81%E7%A7%BB%E9%94%99%E8%AF%AF-%E6%97%A0%E6%95%88%E7%9A%84%E7%BC%96%E7%A0%81%E5%BA%8F%E5%88%97-utf8-0x00/

今天产品部同事报告了一个BUG,经过调试发现,由于用户输入的字符串中,包含字符0x1E, 也就是”记录分隔符”(Record Separator, Notepad++ 显示为[RS]),导致JavaScript XML解析遭遇错误。于是就想在字符串中过滤掉这些没多大用途的字符,同时又要保留部分常用的字符,例如换行,回车和水平制表符。于是写了下面一个 PHP 函数:

/**    
* 清理字符串中的部分不可见控制字符    
*    
* @param string $string 待处理字符串    
* @return string 处理后的字符串    
* @author fising(at)qq.com    
*/    
public static function clearInvisibleCharacter($string = '')    
{    
/* 排除 tab, \n, \r 三个字符 */    
$do_not_searches = array(chr(9), chr(10), chr(13));    
/* 需清理的字符列表 */    
$searches = array();    
for ($i = 0; $i <= 31; $i++)    
{    
if (!in_array(chr($i), $do_not_searches))    
{    
$searches[] = chr($i);    
}    
}    
$searches[] = chr(127);    
return str_replace($searches, '', $string);    
}    

过滤ASCII码中的不可见字符

上面所说的“不可见字符”,其实属于ascii码中的控制字符,它们是0到31、以及127,分别代表什么可查询ascii码表。

在展示页面前,将文字中的控制字符改为空格(ascii 32)

public static String filter(String content){    
if (content != null && content.length() > 0) {    
char[] contentCharArr = content.toCharArray();    
for (int i = 0; i < contentCharArr.length; i++) {    
if (contentCharArr[i] < 0x20 || contentCharArr[i] == 0x7F) {    
contentCharArr[i] = 0x20;    
}    
}    
return new String(contentCharArr);    
}    
return "";    
}    

其具体每个控制字符的含义,详解介绍如下:

ASCII中的Function/Control Code功能字符的详细含义

0 – NUL – NULl 字符/空字符

ASCII字符集中的空字符,NULL,起初本意可以看作为NOP(中文意为空操作,就是啥都不做的意思),此位置可以忽略一个字符。

之所以有这个空字符,主要是用于计算机早期的记录信息的纸带,此处留个NUL字符,意思是先占这个位置,以待后用,比如你哪天想起来了,在这个位置在放一个别的啥字符之类的。

后来呢,NUL字符被用于C语言中,字符串的终结符,当一个字符串中间出现NUL / NULL,代码里面表现为\0,的时候,就意味着这个是一个字符串的结尾了。这样就方便按照自己需求去定义字符串,多长都行,当然只要你内存放得下,然后最后加一个\0, 即空字符,意思是当前字符串到此结束。

1 – SOH – Start
Of Heading 标题开始

如果信息沟通交流主要以命令和消息的形式的话,SOH就可以用于标记每个消息的开始。

1963年,最开始ASCII标准中,把此字符定义为Start of Message,后来又改为现在的Start Of Heading。

现在,这个SOH常见于主从(master-slave)模式的RS232的通信中,一个主设备,以SOH开头,和从设备进行通信。这样方便从设备在数据传输出现错误的时候,在下一次通信之前,去实现重新同步(resynchronize)。如果没有一个清晰的类似于SOH这样的标记,去标记每个命令的起始或开头的话,那么重新同步,就很难实现了。

2 – STX – Start Of Text 文本开始

3 – ETX – End Of Text 文本结束

通过某种通讯协议去传输的一个数据(包),称为一帧的话,常会包含一个帧头,包含了寻址信息,即你是要发给谁,要发送到目的地是哪里,其后跟着真正要发送的数据内容。

而STX,就用于标记这个数据内容的开始。接下来是要传输的数据,最后是ETX,表明数据的结束。

其中,中间具体传输的数据内容,ASCII规范并没有去定义,其和你所用的传输协议,具体自己要传什么数据有关。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值