你的字符非法了吗?

今天在写测分的过程中,写到了非法字符这个词,我突然问自己,什么是非法字符??联想到之前的一个SIT的BUG,是由于我们在取MAC的时候,MAC被篡改了,我们得到的是非法字符,从而导致我们分发事件失败,从而导致线上大量报错,因此我们需要对“非法字符”有一个清醒的认识了。

什么是字符编码?

字符编码(Character encoding)是指将某一字符序列对应到一指定集合中某一东西,再将其对应到另一个给定的集合中的其它东西,如一个自然序列、8位字节或者电脉冲,以便于文本计算机中存储和通过通信网络的发送。

什么是字符集?

字符集(Character Set)是一个系统支持的所有抽象字符的集合。

关于字符编码与字符集,我们通常认为是等同的,使用相同字符编码方式进行编码的所有抽象字符就是一个字符集。

常用的字符编码分类:

ASCII(AmericanStandardCode forInformationInterchange,美国信息交换标准代码)

Unicode(统一码、万国码、单一码、标准万国码)

GB 2312或GB 2312-80是中国国家标准简体中文字符集

GB 18030,最新版本为GB 18030-2005,其全称为中华人民共和国国家标准GB 18030-2005《信息技术中文编码字符集》,是中华人民共和国现时最新的内码字集,是GB 18030-2000《信息技术 信息交换用汉字编码字符集 基本集的扩充》的修订版。


上述资料来源于维基百科,详细内容请参考下面URL地址:http://zh.wikipedia.org/wiki/%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81


那么到底什么是“非法字符”呢?

没有字符是非法的,所谓的非法字符只是这些字符不在我们的字符集里面。从而导致我们在处理的时候不能识别,就认为他们是非法的了。换一种说法是我们认识你你就是合法的,我们不认识你你就是非法的。

非法字符出错的原因:

以两种编码方式为例,ASCII码与GBK码,我们在程序中约定了所有的符号都用ASCII方式进行编码,但你给我传了一个以GBK编码方式编码的字符,但是我仍旧用ASCII方式进行解码,此时我解出来的就肯定是错的,这样解码过程就出错了,就会抛出异常或者直接出错。

OK,那么对于测试及开发同学,我们应该关注什么呢?

1. 关注代码限制的特殊字符。

比如,如果我们的系统中涉及到XML,而XML指定的是UTF-8的编码方式,此时如果传入的XML中节点内容为ǜòēì的GBK编码格式,那么解析的过程就会出错,会抛异常出来。

2. 关注DB中的特殊字符。

比如,DB中的编码格式只支持ASCII,那么当存入汉字类型时就会失败。

3. 业务需求确定的特殊字符。

比如,对于注册账户之类,只允许英文字母+数字+@._这三个标点符号,其它的字符对我们而言都属于非法字符。

BUG分享

相关背景:C系统接收到外围系统发送的事件,使用xfire协议传送给S系统。Xfire协议使用了XML的数据传输格式,支持的编码类型为utf-8.

BUG描述:业务系统会拿到机器的MAC地址(MAC被篡改,包含ǜòēì等GBK字符),作为事件信息中的环境变量传给C系统,C系统收到事件信息后会通过xfire协议转给S系统, 此时xfire协议中的xml解析出错,从而大量抛出异常,导致事件信息转发给S系统出错。


经验及教训:

1.虽然是测试,但是也要对我们的框架熟悉,至少原理要懂,了解在哪些点需要关注字符编码格式。

2.明确哪些情况下需要模拟特殊数据,模拟哪些特殊数据,特殊数据可能会导致我们的系统处理出错。



你可能感兴趣的:(字符)