zoukankan      html  css  js  c++  java
  • 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 微软公有云的体验总结博文,感谢对易北京维清的关注。

  • 相关阅读:
    OK335xS-Android mkmmc-android-ubifs.sh hacking
    OK335xS-Android pack-ubi-256M.sh hacking
    OK335xS Ubuntu 12.04.1 版本 Android 开发环境搭建
    Qt Quick Hello World hacking
    Qt QML referenceexamples attached Demo hacking
    QT 5.4.1 for Android Ubuntu QtWebView Demo
    I.MX6 working note for high efficiency
    QT 5.4.1 for Android Windows环境搭建
    mkbootimg hacking
    Generate And Play A Tone In Android hacking
  • 原文地址:https://www.cnblogs.com/evkchina/p/3469475.html
Copyright © 2011-2022 走看看