問題描述
在本地開發的站點,響應頭中的中文可以正常顯示,部署到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