今天,忽然发现web.config中的<globalization >标签的重要,尤其是在将几个不同服务器上的网闸内容以统一面貌集成在自己网站上时,容易出错,例如下面:
-------------------------------------------------------------------------------------------------------------
在http://blog.csdn.net/goodshot/article/details/8166410提到下面内容:
4.遇到问题:
在正常的一张网页上传中,使用上面的代码不会产生任何文件名乱码的情况。
但是,当用在有母板页的页面上传部位,我发现总是出现文件名乱码错误。
查了一下:母板(包括运行后查看源码)内的编码charset都是utf-8,但是该网页在浏览时却采用了gb2312的方式,可能是是这个造成的上传文件名乱码(不过这个在不是母板生成的单独的上传网页测试,100%上传无乱码)
于是,在ashx文件中添加了代码转换的部分:
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
context.Response.Charset = "utf-8";
HttpPostedFile oFile = context.Request.Files["Filedata"];
byte[] buffer = Encoding.GetEncoding("utf-8").GetBytes(oFile.FileName);
buffer = Encoding.Convert(Encoding.GetEncoding("utf-8"), Encoding.GetEncoding("gb2312"), buffer);
string fn = Encoding.UTF8.GetString(buffer);//网页编码 http://blog.csdn.net/goodshot/article/details/8627731
string strUploadPath = HttpContext.Current.Server.MapPath(@context.Request["folder"]) + "\\" + HttpContext.Current.User.Identity.Name + "\\";
if (oFile != null)
{
if (!Directory.Exists(strUploadPath))
{
Directory.CreateDirectory(strUploadPath);
}
oFile.SaveAs(strUploadPath + oFile.FileName);
//下面这句代码缺少的话,上传成功后上传队列的显示不会自动消失
context.Response.Write("1");
}
else
{
context.Response.Write("0");
}
}
运行后虽能解决部分问题,但仍有部分文件名出现乱码。
最终解决问题发现:问题实在网站的web.config中有这样的设置:
<globalization requestEncoding="gb2312" responseEncoding="gb2312"/>
去掉后(默认发送和接受都是utf-8),去掉上面添加的红色编码转换部分。成功!
--------------------------------------------------------------------------------------------------------------
但是,测试另外一个利用其他服务器内容能够,将其集成到我的系统的其他网站内容时的模块时(模拟http申请网站信息),原来能正常返回并解析的内容突然找不到了。
稍一分析,很有可能是去掉了上面的<globalization>,造成了原来能够申请到信息的网站无法根据关键字返回信息,对方很可能就是符合发送申请的GB2312标准。于是,在该子模块所在的文件夹下添加一个web.config,单独添加<globalization requestEncoding="gb2312" responseEncoding="gb2312"/>内容,覆盖根目录下刚才默认的UTF-8标准。测试,成功!
方法,简单易行,只要明白原理,一切都轻松!