- 本站大部分内容从网上收集,收集目的仅供研究、学习。涉及版权或不希望收录您的文章请您及时与我联系。
- 本站IM群,请自行选择。请各位朋友按照自己喜好加入。加入群后请及时发言,防止被清理。谢谢您的合作!!!
- QQ群:Y①WEB开发(ASP.NET)号码:7351660 QQ群:Y②WEB开发(ASP+.NET)号码:11864905
- QQ群:Y③WEB开发(DIV+CSS)号码:16610506 QQ群:Y④WEB开发(JS+AJAX)号码:16143998
- QQ群:Y⑤WEB开发(新手)号码:12777715 MSN群:yaosansi[at]126.com
原文: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);
订阅本站,阅读更多文章