这是个小事故导致的。。。
我们线上有个节目里名称里(`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)MSTJXu0005CX0B3J69,明显里面有特殊符号,unicode
于是方案就简单了,干掉字符串中相关非法字符即可
将常见非法字符纠结起来
private static readonly char[] InvalidFileNameChars = new[]{'"', '<','>','|',' ','u0001','u0002','u0003','u0004','u0005','u0006','a','',' ','
','v','f','
','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
这种小功能小记以备后期有相关问题能作小经验查看