原程序在生成网址的时候,只是做了一个简单的字符过滤,说它简单吧,其实它也不简单,还循环了好多次才把不想要的字符给拿掉。说它不简单吧,本来用几个正则就可以搞定的事情,它写的那么复杂,还要定义哪些字符要拿掉。
问题就出在怎么定义要拿掉的那些字符上。原程序把键盘上可见的符号基本全输了一遍,这就算过滤了。这样行吗?当然不行啦!那些不可见的字符,0x00, 0x13, 0x19 多的去了,不可见,不可打印,输出到网页不是方块就是问号。
问号在网址里可不是乱用的,放错地方返回就是个 401 Not Found.
说到正则上,一开始我以为 \w 只包括字母数字汉字(还有其它的文字)而以,结果我错了,它还包括 下划线 _ ,以至于 [^\w-]+ 对下划下跟本不起作用。
现在很多中文网站的URL都使用了汉字,但是浏览器会对它们进行转码,本来是为了SEO而加去出的汉字,结果被转了码,不知道对SEO有没有影响,这个不在我的考虑范围之内,因为我们的网站只有英文还有一些不可见不可打印的字符。
public static class StringExtend {
private static Regex illegalReg = new Regex(@"[^a-z0-9-]+", RegexOptions.Compiled |
RegexOptions.IgnoreCase);
private static Regex illegalReg2 = new Regex("-+", RegexOptions.Compiled);
private static Regex illegalReg3 = new Regex("^-+|-+$", RegexOptions.Compiled);
public static string FilterIllegalCharForUrl( this string str ) {
str = illegalReg.Replace(str, "-");
str = illegalReg2.Replace(str, "-");
str = illegalReg3.Replace(str, "");
return str;
}
}
说到不可见,不可打印的字符上,在XML里,如果出现了这些字符,在 XmlDomdocument.Load 的时候,会报错,什么 0x00, 0x19, 0x13,我本来想找一种容错方法,比如在PHP里,可以先对 文本做 iconv("","UTF-8", $str),然后在写到 XML 或 Load 就可以避免这种错误,但是在 c# 里,我目前还没有查到要怎么做。
XmlReaderSettings 有个 CheckCharacters 属性,
MSDN里是这样解释的:
获取或设置一个值,该值指示是否进行字符检查。
如果 XmlReader 处理文本数据,则无论属性如何设置,读取器将总是检查 XML 名称和文本内容是否有效。
将 CheckCharacters 设置为 false 会禁用对字符实体引用的字符检查。
指示读取器检查字符,如果有任何字符不在合法的 XML 字符范围内,将引发异常。字符检查包括检查文档
中的非法字符,以及检查 XML 名称的有效性(例如,XML 名称不能以数字开头)。
有关更多信息,请参见 W3C XML 1.0 建议的 2.2 节 (http://www.w3.org/TR/REC-xml#charsets) 和 2.3
节 (http://www.w3.org/TR/REC-xml#NT-Name)。
按照字面的意思,这个属性对文本数据不起作用,但是我把文本转成 stream ,结果还是报一样的错误。
这样不行,只好在 Load 之前替换了,以下是Xml非法字符的定义范围:
[\u0000-\u0008\u000B\u000C\u000E-\u001F\uD800-\uDFFF\uFFFE\uFFFF]
摘自: http://www.bobopo.com/article/1000/56.htm
但是和 w3.org 上给出的范围不一样,不明白,也没有细看。
| < Prev | Next > |
|---|
Last Updated ( Friday, 30 July 2010 18:05 )



