好吧,这让我们抓狂了。我们有一个在 ASP.NET 4.0 中构建的应用程序,运行在 Windows Server 2012 和 IIS8 上。
我们网站的一些页面被翻译成多种语言,其中日语和中文是最成问题的。
如果我们将应用程序池设置为集成模式,某些字符将无法正确显示。我们会看到一些小问号。
如果我们将应用程序池设置为经典模式,所有字符都会正确显示。不幸的是,这对我们来说不是一个长期选择,因为它会破坏网站上的其他功能。
有趣的是 - 如果我们更改应用程序池->高级设置中的“启用 32 位应用程序”设置,页面仍然会显示虚假字符,但它们会错误地显示不同的字符。
最初我们怀疑页面中存在伪造字符或编码问题 - 但我们已经检查了所有内容四次,并确认所有内容都是 utf-8。将应用程序池切换到 32 位并看到不同字符显示不正确,这让我认为 IIS 可能出了问题。
提前感谢任何帮助/见解/经验。
答案1
本篇分为两部分:
从https://technet.microsoft.com/en-us/library/cc753449%28v=ws.10%29.aspx
“在 IIS 7 中,应用程序池以两种模式之一运行:集成模式和经典模式。应用程序池模式会影响服务器处理托管代码请求的方式。如果托管应用程序在集成模式下的应用程序池中运行,则服务器将使用 IIS 和 ASP.NET 的集成请求处理管道来处理请求。但是,如果托管应用程序在经典模式下的应用程序池中运行,则服务器将继续通过 Aspnet_isapi.dll 路由托管代码请求,处理请求的方式与应用程序在 IIS 6.0 中运行的方式相同。”
https://forums.iis.net/p/1173138/1962242.aspx
一些遇到类似问题的人提出了一些解决方案,强制 IIS 7 按照他们想要的方式处理字符集。 其要点是 classic/IIS 6 正在接受您想要的编码,但在管道中的某个地方,integrated/IIS 7 正在使用其默认编码。
这讨论了如何按照您想要的方式设置编码: https://stackoverflow.com/questions/9781157/how-to-set-iis-websites-default-encoding
您可能需要使用 fiddler/firebug 来查看它的进展情况(当应该是 ISO-8859-1 时却是 utf8,反之亦然)。
最后但同样重要的是,关于 ASP.Net 如何处理全球化问题的一篇真实论文: https://support.microsoft.com/en-us/kb/893663。适用于 2.0,但根据我的经验,很多类似的东西都会延续到更高版本,并且可能适用于 4.0。