• Windows Azure 微软公有云体验(三) IIS中文编码解决方案


    Windows Azure 微软公有云已经登陆中国有一段时间了,现在是处于试用阶段,Windows Azure的使用将会给管理信息系统的开发、运行、维护带来什么样的新体验呢?

    Windows Azure平台中有网站、虚拟机、云服务、SQL数据库、存储、服务总线、网络、管理服务、活动目录等模块。

    Windows Azure 微软公有云体验(一)已经对网站做了简单介绍,说到Windows Azure网站模块类似于服务器中的IIS,但是在某些方面跟我们平时使用的会有些区别的,下面谈谈Windows Azure网站模块的IIS中文编码带来的一些问题及解决方案。

    饮水思源,转载勿删:http://www.cnblogs.com/evkchina/p/3469475.html,请支持关注北京易维清源代码生成软件www.evkchina.com 

    我们做了多次测试发现,发布到Windows Azure网站的编码方式为中文时会出现乱码问题,包括两方面:

    1.在Get请求有中文参数时,使用IE11时提示502错误(使用F12调试模式中的edgeie10ie9ie8ie7同样出现此错误)

    2.对于下载文件名乱码的测试结果如下,

    浏览器 Debug 中文IIS7 微软云网站 http_user_agent(浏览器版本号)
    IE11 正常 正常 正常 mozilla/5.0 (windows nt 6.1; wow64; trident/7.0; rv:11.0) like   gecko
    IE10 正常 正常 正常 mozilla/5.0 (compatible; msie 10.0; windows nt 6.2; wow64;   trident/6.0)
    IE9 正常 正常 正常 mozilla/5.0 (compatible; msie 9.0; windows nt 6.1;   trident/5.0)
    搜狗高速 正常 正常 正常 mozilla/5.0 (windows nt 6.1; wow64; trident/7.0; rv:11.0; se   2.x metasr 1.0) like gecko
    搜狗兼容 正常 正常 正常 mozilla/5.0 (windows nt 6.1; wow64; trident/7.0; rv:11.0; se   2.x metasr 1.0) like gecko
    FireFox 正常 正常 正常 mozilla/5.0 (windows nt 6.1; wow64; rv:25.0) gecko/20100101   firefox/25.0
    Google 正常 正常 正常 mozilla/5.0 (windows nt 6.1; wow64) applewebkit/537.36 (khtml,   like gecko) chrome/31.0.1650.63 safari/537.36
    Opera 正常 正常 正常 mozilla/5.0 (windows nt 6.1; wow64) applewebkit/537.36 (khtml,   like gecko) chrome/31.0.1650.57 safari/537.36 opr/18.0.1284.49
    safari 5 正常 正常 乱码 mozilla/5.0 (windows nt 6.1; wow64) applewebkit/534.52.7   (khtml, like gecko) version/5.1.2 safari/534.52.7
    safari 7 正常 正常 乱码 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9) AppleWebKit/537.71 (KHTML, like Gecko) Version/7.0 Safari/537.71
    chrome 正常 正常 正常 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1711.3 Safari/537.36
    FireFox 正常 正常 正常 Mozilla/5.0 (Macintosh; Intel   Mac OS X 10.9; rv:20.0) Gecko/20100101 Firefox/20.0

    safari出现错误,文件名为乱码但是能够正常下载打开

    首先,是Windows Azure的环境因素,发布到[Windows Azure网站]的所有网站都是在后台的Windows服务器上托管的,Windows操作系统和IIS都是国际统一的,英文环境。因此发布的网站最好显式地设定网站或者文件的编码方式,建议使用UTF-8编码格式。

    针对Get请求有中文参数的情况,可尝试显式的指定Charset,如:xmlRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");

    然后,把中文参数给Encode一下

    其次,针对下载文件乱码的情况,建议修改Web.config

    将globalization节点修改为<globalization requestEncoding="utf-8" responseEncoding="utf-8" fileEncoding="GB2312" culture="zh-CN" uiCulture="zh-CN" />后,发布至Windows Azure网站,除了让人揪心的火狐,IE和其他浏览器均正常通过。

    3.火狐浏览器下载文件名乱码的解决方法

    经过测试,火狐浏览器下载文件时,文件名使用MIME编码方式,可避免文件名出现乱码。

    MIME 是“多用途网际邮件扩充协议”的缩写,使用这种编码的原因是因为 Internet 上的很多网关不能正确传输8 bit 内码的字符,比如汉字等。编码的原理就是把 8 bit 的内容转换成 7 bit 的形式以能正确传输。MIME 定义了两种编码方法Base64与QP(Quote-Printable) :

    Base 64 编码把三个Byte的数据用 4 个Byte表示,这样,这四个Byte 中,每个 Byte 实际用到的都只有 6 bit。Base 64的缩写为“B”。

    QP(Quote-Printable) 编码,是把一个 8 bit 的字符用两位16进制数值表示,然后在前面加“=”。QP(Quote-Printable) 编码的缩写为“Q”

    下面是从服务器下载文件的实例:

    string cPath = System.Web.HttpContext.Current.Server.MapPath("/我的文件.PNG");

    string fileName = "我的文件.PNG"; //输出的文件

    string UserAgent = context.Request.ServerVariables["http_user_agent"].ToLower();

    //判断浏览器

    if (UserAgent.IndexOf("firefox") < 0)

    {

    //不是火狐浏览器

    fileName = HttpUtility.UrlEncode(fileName, Encoding.UTF8);

    }

    else

    {

    //是火狐浏览器,采用 MIME 编码

    fileName = "=?GB2312?B?" + Convert.ToBase64String(Encoding.Default.GetBytes(fileName)) + "?=";

    }

    FileStream fileStream = new FileStream(cPath, FileMode.Open, FileAccess.Read, FileShare.Read);

    byte[] bytes = new byte[fileStream.Length];

    fileStream.Read(bytes, 0, bytes.Length);

    fileStream.Close();

    context.Response.AddHeader("content-type", "application/x-msdownload");

    context.Response.AddHeader("Content-Disposition", "attachment;filename="" + fileName + """);

    context.Response.AddHeader("Content-Length", count.ToString());

    context.Response.BinaryWrite(bytes);

    context.Response.Flush();

    context.Response.End();

    北京易维清源代码生成软件已完全支持与微软Azure云平台的对接,生成的源代码对各浏览器的兼容性问题已经全部解决。接下来会有更多Windows Azure 微软公有云的体验总结博文,感谢对易北京维清的关注。

  • 相关阅读:
    Atitit.struts2体系结构大总结
    Atitit.hibernate体系结构大总结
    Atitit. 最佳实践 QA----降低cpu占有率--cpu占用太高怎么办
    Atitit.软件GUI按钮与仪表盘(01)--js区-----js格式化的使用
    Atitit.软件控件and仪表盘(23)--多媒体子系统--视频输出切换控制cvbs av s-video Ypbpr pal ntsc
    Atitit.软件开发概念说明--io系统区--特殊文件名称保存最佳实践文件名称编码...filenameEncode
    Atitit.软件按钮与仪表盘(13)--全文索引操作--db数据库子系统mssql2008
    Atitit.软件GUI按钮与仪表盘(01)--报警系统--
    Atitit.软件开发概念(11)--网络子系统--url编码 空格问题URLEncoder java js php
    Atitit.软件仪表盘(0)--软件的子系统体系说明
  • 原文地址:https://www.cnblogs.com/evkchina/p/3469475.html
Copyright © 2020-2023  润新知