原文:http://www.yaosansi.com/post/1368.html
服务器环境:Linux + Apache
原字符串:
Apache 编码后字符串:
.net 中
System.Web.HttpUtility.UrlEncode("[ADO] Microsoft ADO 2.5 程序员参考.chm");
1.更改Encoding为Gb2312
看起来有很大差异,经测试Apache 使用的编码为gb2312,所以改为如下代码:
System.Web.HttpUtility.UrlEncode("[ADO] Microsoft ADO 2.5 程序员参考.chm", System.Text.Encoding.GetEncoding("gb2312"));
2.将+号替换成%20
经比较两行代码已经非常相似了,但可以明显看出.net生成的代码中包含"+"号,而Apache 编码后的符串是没有的.对应的位置是%20,所以将+号替换成%20.
HttpUtility.UrlEncode("[ADO] Microsoft ADO 2.5 程序员参考.chm", Encoding.GetEncoding("gb2312")).Replace("+", "%20");
结果:
3.使用正则替换编码后的字符为大写
现在除了一些字符大小写不同外,结果与Apache生成的代码基本上可以说是一致了(按照IIS的习惯),由于Apache 默认是区分大小写的.所以我们高兴的还早了点.这样的编码结果Apache 仍然会提示找不到文件.
仔细观察经过编码后的双字节字符(也就是形如%5B)在Apache中都是大写字母,而原始的英文字母大小写Apache并没有改变.所以将整个字符串全部大写是行不通的.
这里采用了正则来替换相应编码后的字符串.
代码如下:
protected static string getReg(string str)
{ MatchEvaluator myEvaluator = new MatchEvaluator(ReplaceMe); string pattern = "%(.{2})";
string s= Regex.Replace(str, pattern, myEvaluator); return s; }
protected static string ReplaceMe(Match m)
{ return m.Value.ToUpper(); }
之后便可以使用getReg()方法更改编码后的字符了.
string UrlEncodeStr = HttpUtility.UrlEncode("[ADO] Microsoft ADO 2.5 程序员参考.chm", Encoding.GetEncoding("gb2312")).Replace("+", "%20");
UrlEncodeStr=getReg(UrlEncodeStr);

- 评论:(0)
发表评论 点击这里获取该日志的TrackBack引用地址