我在 Tomcat 服务器上通过 IntelliJ Idea 部署了一个 .war 文件。
我注意到一个字符“ä”没有正确显示,而在其他地方正确显示了相同的字符。我发现只有我在 .js 文件中硬编码的特殊字符受到影响。
我尝试在 IntelliJ 中将所有 .js 文件设置为 UTF-8,我还将所有标准编码设置更改为 UTF-8,但错误并没有消失。
我所有的js文件都是用webpack映射到一个index.js文件中的,具体是怎么映射的我就不知道了,因为这是别人一开始搭建的项目。
我最近做了一个有趣的新观察:
当我第一次打开浏览器(使用 Firefox 和 Chrome 测试)时,它显示不正确:
在常规重新加载 (F5
) 时没有任何变化,但是当使用 CTRL + F5
重新加载时它突然正确了:
这让我很困惑……有谁知道这里会发生什么?
我的 Java 文件曾经遇到过同样的问题,但是在更改了我的 gradle 构建文件中的编码后,它就起作用了。
最后我的问题是:
您认为我应该更改哪些内容才能始终正确显示特殊字符?
最佳答案
我在 Windows 服务器上的 tomcat 更新后添加了一个类似的问题:javascripts 内容在浏览器端损坏了字符。 http header 是正确的,所以我进一步调查了一下。
在服务器上,javascript 文件以没有 BOM 的 utf-8 格式保存。
使用 Wireshark,我看到字符“é”(UTF-8 编码文件中的 C3-A9)作为 (C3-83-C2-A9) 传输。这意味着 Tomcat 正在读取一个 ANSI 文件 并将其轻轻地转换为 UTF8!
所以我只是将 BOM 添加到保存的文件中并修复了错误。 (REM:用notepad++很容易添加BOM)。
但我不想更新所有服务器文件,我希望 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>
关于javascript - .js 文件中的特殊字符最初未正确显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49275165/