【Azure 應用服務】App Service站點Header頭中的中文資訊顯示亂碼?當下載檔案時,檔名也是亂碼?

路邊兩盞燈發表於2021-03-15

問題描述

在本地開發的站點,響應頭中的中文可以正常顯示,部署到Azure App Service站點後,響應中文亂碼。通過多方面驗證,在程式碼中設定Response的Headers會顯示亂碼,而直接配置在Web.Config中的Header則能正常顯示。

 

程式碼中寫的中文會亂碼

context.HttpContext.Response.Headers.Add("ChineseTest", "");

在web.config中的正常顯示

  <system.webServer>
    <handlers>
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="OPTIONSVerbHandler" />
      <remove name="TRACEVerbHandler" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
    <httpProtocol>
      <customHeaders>
        <add name="abc" value="中"/>
      </customHeaders>
    </httpProtocol>
  </system.webServer> 

 

問題解決


#使用UTF8來編碼中文字元 context.HttpContext.Response.Headers.Add(
"ChineseTest", HttpUtility.UrlEncode("", System.Text.Encoding.UTF8));
#如果是需要下載檔案或者設定檔名稱,所以需要使用Content
-Disposition頭 string headerValue = "attachment;"; headerValue += " filename=" + HttpUtility.UrlEncode("中.txt", System.Text.Encoding.UTF8) + ";"; headerValue += " filename*=utf-8''" + HttpUtility.UrlEncode("中.txt", System.Text.Encoding.UTF8); HttpContext.Response.Headers.Add("Content-Disposition", headerValue);

 

問題分析

Http Header預設只接受ISO-8859-1的編碼,對於非ISO-8859-1/ASCII編碼的字元,如果直接傳輸的話會由於編碼不一致導致顯示亂碼的問題。所以建議採用URL encode的方式,將中文通過這種方式傳輸,那麼瀏覽器收到該header時,會解碼之後顯示。 如:HttpUtility.UrlEncode("中文字元", System.Text.Encoding.UTF8)

 

另外,由於不同的瀏覽器支援的編碼不太相同,目前市面上的大部分瀏覽器都是支援使用utf-8編碼方式的,所以針對Safari瀏覽器顯示異常的問題,在Content-Disposition後續推出的filename*引數中支援指定的編碼方式對filename進行處理。 操作方式正是如下程式碼:

string headerValue = "attachment;";
headerValue += " filename=" + HttpUtility.UrlEncode("中.txt", System.Text.Encoding.UTF8) + ";";
headerValue += " filename*=utf-8''" + HttpUtility.UrlEncode("中.txt", System.Text.Encoding.UTF8);
HttpContext.Response.Headers.Add("Content-Disposition", headerValue);

 

參考資料

Content-Disposition頭部中文編碼測試:http://imushan.com/2019/04/10/network/Content-Disposition%E5%A4%B4%E9%83%A8%E4%B8%AD%E6%96%87%E7%BC%96%E7%A0%81%E6%B5%8B%E8%AF%95/

HTTP協議header中Content-Disposition中文檔名亂碼https://my.oschina.net/pingpangkuangmo/blog/376332

 

 

相關文章