.js文件中的特殊字符最初未正确显示

时间:2018-03-14 10:21:50

标签: javascript tomcat gradle intellij-idea webpack

我在Tomcat服务器上通过IntelliJ Idea部署了.war文件 我注意到一个字符“ä”没有正确显示,而在其他地方正确显示相同的字符。我发现只有我在.js文件中硬编码的特殊字符才会受到影响 我试图在IntelliJ中将所有.js文件设置为UTF-8,我还将所有标准编码设置更改为UTF-8,但错误没有消失。
我的所有js文件都使用webpack映射到一个index.js文件,但我究竟不知道,因为这是一个最初由其他人设置的项目。

我最近做了一个新的有趣观察: 当我第一次打开浏览器(使用Firefox和Chrome测试)时,它显示不正确:
Wrong display
在定期重新加载(F5)时没有任何变化,但是当使用CTRL + F5重新加载时,它突然变为正确: Correct display
这让我很困惑......有没有人知道这里会发生什么? 我以前在我的Java文件中遇到了同样的问题,但是在我的gradle构建文件中更改了编码之后 最终我的问题是:
为了让特殊字符始终正确显示,您认为我应该如何改变?

2 个答案:

答案 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,你可能已经完成了它。

基本上,请确保:

  1. 文件(.js,.html等)以正确的编码格式存储,并且在使用该编码查看时,会正确显示字符。强烈建议对每种类型的文件使用相同的编码,尽管从理论上讲,它可以将UTF-8用于JavaScript文件,并且(比如说)Windows-1252用于HTML文件。但这只是要求复杂性和麻烦。

  2. 确保管道中的每个步骤都正确识别用于文件的编码。这意味着(例如)Tomcat需要为.js文件包含标题Content-Type: application/javascript; charset=utf-8或类似标题。 (text/javascript; charset=utf-8也可以使用,但已过时。)但对于HTML文件,the W3C recommends包括meta标题,忽略 charset来自Content-Type

  3. 确保您的HTML文件同时在meta顶部附近的head标记中识别编码(在前1024个字节内):<meta charset="UTF-8"> W3C {{ 3}} (与上面的子弹相同的链接)用于执行此操作,例如在本地保存文件并打开它(因此没有HTTP标头),使人和机器读者清楚等等