我在Tomcat服务器上通过IntelliJ Idea部署了.war文件
我注意到一个字符“ä”没有正确显示,而在其他地方正确显示相同的字符。我发现只有我在.js文件中硬编码的特殊字符才会受到影响
我试图在IntelliJ中将所有.js文件设置为UTF-8,我还将所有标准编码设置更改为UTF-8,但错误没有消失。
我的所有js文件都使用webpack映射到一个index.js文件,但我究竟不知道,因为这是一个最初由其他人设置的项目。
我最近做了一个新的有趣观察:
当我第一次打开浏览器(使用Firefox和Chrome测试)时,它显示不正确:
在定期重新加载(F5
)时没有任何变化,但是当使用CTRL + F5
重新加载时,它突然变为正确:
这让我很困惑......有没有人知道这里会发生什么?
我以前在我的Java文件中遇到了同样的问题,但是在我的gradle构建文件中更改了编码之后
最终我的问题是:
为了让特殊字符始终正确显示,您认为我应该如何改变?
答案 0 :(得分:2)
在Windows服务器上的tomcat更新后,我添加了一个类似的问题:浏览器端的javascripts内容损坏了字符。 http标头是正确的,因此我进行了进一步调查。
在服务器上,javascript文件保存在utf-8中,没有BOM。
通过Wireshark,我看到字符'é'(UTF-8编码文件中的C3-A9)被传输为(C3-83-C2-A9)。这意味着 Tomcat正在读取ANSI文件,然后将其轻轻地转换为UTF8!
因此,我只是将BOM表添加到保存的文件中,并修复了该错误。 (REM:使用记事本++可以轻松添加物料清单。)
但是我不想更新所有服务器文件,我想让tomcat正确读取UTF-8。
简单的解决方法是在 tomcat web.xml 中定义文件编码,如下所示:
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<!------------------- add the settings here ------------->
<init-param>
<param-name>fileEncoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<!------------------- end of the added settings ------------->
<load-on-startup>1</load-on-startup>
</servlet>
答案 1 :(得分:1)
这让我很困惑......有没有人知道这里会发生什么?
缓存。 Ctrl + F5告诉浏览器重新加载资源,即使它已缓存。如果它在缓存中,F5将重用缓存中的资源。
为了让特殊字符始终正确显示,您认为我应该如何改变?
考虑到上面的F5 / Ctrl + F5,你可能已经完成了它。
基本上,请确保:
文件(.js,.html等)以正确的编码格式存储,并且在使用该编码查看时,会正确显示字符。强烈建议对每种类型的文件使用相同的编码,尽管从理论上讲,它可以将UTF-8用于JavaScript文件,并且(比如说)Windows-1252用于HTML文件。但这只是要求复杂性和麻烦。
确保管道中的每个步骤都正确识别用于文件的编码。这意味着(例如)Tomcat需要为.js文件包含标题Content-Type: application/javascript; charset=utf-8
或类似标题。 (text/javascript; charset=utf-8
也可以使用,但已过时。)但对于HTML文件,the W3C recommends包括meta
标题,忽略 charset
来自Content-Type
。
确保您的HTML文件同时在meta
顶部附近的head
标记中识别编码(在前1024个字节内):<meta charset="UTF-8">
W3C {{ 3}} (与上面的子弹相同的链接)用于执行此操作,例如在本地保存文件并打开它(因此没有HTTP标头),使人和机器读者清楚等等