这是个小事故导致的。。。
我们线上有个节目里名称里(`F`H9)MSTJXCX0B3J69,虽然我们看到是(`F`H9)MSTJXCX0B3J69,但百思不得其解,发现每次在XmlDocument.Load(xml)时抛出异常
后打了段log到服务器上,拷贝回来后发现生成(`F`H9)MSTJX(ENQ)CX0B3J69,其中(ENQ)是UI和数据库里没显示的部分,而且也无法拷贝出来,只是在Submit Text中显示为(ENQ),明显是个不可见字符,分析应该是特殊符号导致的
远程调试将所有xml拿到看到在字符串quick watch得到是(`F`H9)MSTJX\u0005CX0B3J69,明显里面有特殊符号,unicode
于是方案就简单了,干掉字符串中相关非法字符即可
将常见非法字符纠结起来
private static readonly char[] InvalidFileNameChars = new[]{'"', '<','>','|','\0','\u0001','\u0002','\u0003','\u0004','\u0005','\u0006','\a','\b','\t','\n','\v','\f','\r','\u000e','\u000f',
'\u0010','\u0011','\u0012','\u0013','\u0014','\u0015','\u0016','\u0017','\u0018','\u0019','\u001a','\u001b','\u001c','\u001d','\u001e','\u001f',':','*',
'?','\\','/' };
然后通过一个滤掉非法字符函数处理下
public string CleanInvalidFileName(string fileName)
{
fileName = fileName + "";
fileName = InvalidFileNameChars.Aggregate(fileName, (current, c) => current.Replace(c + "", ""));
if (fileName.Length > 1)
if (fileName[0] == '.')
fileName = "dot" + fileName.TrimStart('.');
return fileName;
}
写了个小测试,我们之前原非法字符串为:(`F`H9)MSTJXCX0B3J69.gif
经CleanInvalidFileName后为:(`F`H9)MSTJXCX0B3J69.gif
测试成功,然后将该函数加入应用系统,写了个扩张函数,将对应的一些需要处理的name等属性后直接调用该扩展方法,编译后跑系统,果然OK
这种小功能小记以备后期有相关问题能作小经验查看