你的字符非法了吗?

今天在写测分的过程中,写到了非法字符这个词,我突然问自己,什么是非法字符??联想到之前的一个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.明确哪些情况下需要模拟特殊数据,模拟哪些特殊数据,特殊数据可能会导致我们的系统处理出错。



<think>好的,用户的问题是确认宏定义UI_PRINT_FILE_NAME_INVALIID是否包含对反斜杠'\'的检查。首先,我需要回顾之前的对话和用户提供的引用内容,确保回答准确。 从用户的上一次问题中,他们提到了宏UI_PRINT_FILE_NAME_INVALID,并指出该宏用于检测Windows系统的非法字符,包括反斜杠。用户现在可能是在检查代码时发现了拼写错误,或者想确认反斜杠是否被正确包含在内。 在之前的回答中,我修正了宏的拼写错误(INVALIID→INVALID),并指出宏中的字符串包含反斜杠。需要确认当前用户提到的宏名称是否有拼写错误,因为在用户的问题中,宏名称是UI_PRINT_FILE_NAME_INVALIID(多了一个'I')。这可能是一个笔误,但需要明确指出。 接下来,查看宏定义中的字符集合。原代码中的字符串是"\\/:*?\"<>|",其中第一个字符是转义后的反斜杠,即代表实际的反斜杠字符。因此,宏确实检查了反斜杠的存在。 用户提供的引用内容中并没有直接涉及该宏,但引用了关于strpbrk函数的使用,该函数用于搜索字符串中的字符集合。需要确认strpbrk的使用是否正确,以及转义字符是否正确处理。 需要注意的是,用户可能是在代码审查或调试时遇到了问题,特别是文件名中包含反斜杠导致验证失败的情况。因此,需要明确回答是否包含反斜杠,并指出可能的拼写错误,因为正确的宏名称应该是INVALID而是INVALIID,这可能会影响功能。 此外,用户可能希望了解如何修正这个拼写错误,以及该错误是否会导致宏无法正常工作。因此,在回答中应包含修正建议,并说明拼写错误的影响。 总结:宏定义中的字符串确实包含反斜杠,但由于宏名称的拼写错误,可能导致宏未被正确调用。需要指出拼写错误,并确认反斜杠的检查存在。</think>1. **字符集检查确认** 在宏定义`UI_PRINT_FILE_NAME_INVALIID`的非法字符集合字符串中,第一个字符为**转义后的反斜杠**`\\`,对应实际检测的反斜杠`\`字符。完整的非法字符列表为: $$ \text{非法字符集} = \{ \backslash, /, :, *, ?, ", <, >, | \} $$ 因此该宏**包含对反斜杠的检查**。 2. **代码验证说明** ```c // 原宏定义字符集参数 "\\/:*?\"<>|" // 首字符\\表示检测单个反斜杠\ ``` 通过`strpbrk`函数的行为特性可知,当文件名中包含`\`时,函数会返回非NULL指针,触发错误提示[^1]。 3. **重要补充说明** 需注意原宏定义存在**拼写错误**: `UI_PRINT_FILE_NAME_INVALIID`(多了一个字母I) 建议修正为: `UI_PRINT_FILE_NAME_INVALID` 否则可能导致实际调用时无法正确关联宏定义。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值