【问题标题】:Ubuntu/Tomcat Server UTF-8 encoding issueUbuntu/Tomcat 服务器 UTF-8 编码问题
【发布时间】:2018-04-21 00:22:38
【问题描述】:

我正在使用 Java/Jsp 开发一个 Web 应用程序,该应用程序在带有 Tomcat 8 的 Ubuntu 14.04 LTS 服务器上运行,其中以下 UTF-8 编码问题与节符号 § 出现。

服务器端§部分符号的任何形式输入都会被转换为§,我不知道为什么。

简单的系统输出:

Should Print [§] - [output]: §
Char: § ASCII 167

HTML/客户端没问题,因为 wireshark 跟踪显示正确的 char § 已传送到服务器。所以问题一定出在 tomcat-server 本身。

以下内容已经设置:

  1. 设置 JSP 编码、HTML5 编码

&lt%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    &ltmeta charset="utf-8" />

  1. 设置 Java 编码

protected void doPost(HttpServletRequest request, HttpServletResponse 
response)
    throws ServletException, IOException {
    // Set CharSet to UTF-8
    response.setContentType("text/html; charset=UTF-8");
    response.setCharacterEncoding("UTF-8");
    request.setCharacterEncoding("UTF-8");

  1. 服务器设置

语言环境-a C C.UTF-8 en_US.utf8 POSIX
  1. tomcat.conf Tomcat 8 设置

env JAVA_OPTS="-Djava.awt.headless=true -
    Djava.security.egd=file:/dev/./urandom -
Djavax.servlet.request.encoding=UTF-8 -Dfile.encoding=UTF-8"
    env CATALINA_OPTS="-Xms512M -Xmx1024M -server -XX:+UseParallelGC -
Dfile.encoding=UTF-8"

server.xml - 在 GET 的连接器标记中(与我无关)添加“URIEncoding”属性为



    <Connector port="8080" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443" URIEncoding="UTF-8"/>

并取消注释 web.xml 中的 UTF-8 过滤器



    &ltfilter>
        &ltfilter-name>setCharacterEncodingFilter&lt/filter-name>
        &ltfilter-
    class>org.apache.catalina.filters.SetCharacterEncodingFilter&lt/filter-class>
        &ltinit-param>
            encoding&lt/param-name>
            UTF-8&lt/param-value>
        &lt/init-param>
        &ltasync-supported>true&lt/async-supported>
    &lt/filter>

现在我没有想法,希望得到一些有用的提示:)

谢谢!

编辑:似乎任何 UTF-8 代码 > U+00A0 都无法正常工作 sn-p <pre></pre>

U+00A1  ¡   c2 a1   INVERTED EXCLAMATION MARK
U+00A2  ¢   c2 a2   CENT SIGN
U+00A3  £   c2 a3   POUND SIGN
U+00A4  ¤   c2 a4   CURRENCY SIGN
...

Sysout: ¡ ¢ ã ä...

编辑:

我已经尝试了我发现的任何东西,但它仍然无法正常工作:System.properties() 返回以下内容。也许有人有其他想法。

     logger.debug("SETTINGS: " + System.getProperties() );
     ...
     file.encoding.pkg=sun.io
     javax.servlet.request.encoding=UTF-8
     sun.jnu.encoding=ANSI_X3.4-1968
     file.encoding=UTF-8
     sun.io.unicode.encoding=UnicodeLittle
     ....

【问题讨论】:

  • 首先尝试\u00A7 而不是§。这是为了检查编辑器和jspc编译器是否使用相同的编码(WYSInWYG)。对 .java 和 .jsp 都试试这个。不知何故,UTF-8 字节的解释不同。
  • 感谢您的分析:jsp 将其正确解释为 § 和 java(tomcat) 部分 Java 打印... \u00A7: §
  • 检查 .war 中的 JSP。例如,使用 maven 构建,使用复制过滤资源可能会造成严重破坏,尤其是使用必须符合 ISO-8859-1 的 .properties。

标签: java jsp tomcat encoding utf-8


【解决方案1】:

在jsp的顶部:

<%@page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"
%><!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">

(恐怕已经是这样了。)在浏览器中检查页面编码和HTML源文本。

【讨论】:

  • 这已添加到代码中。表单数据被正确解释并正确提交给网络服务器。 (wireshark 跟踪)
  • 我混乱的来回运行包括尝试其他浏览器、检查缓存工具、部署等等。但是如果\u00A7 也被破坏,很可能某些web 过滤器 可能是有罪的:一个缩小器之类的。还要检查不带字符集的new String, getBytes, InputStreamReader, OutputStreamReader 的来源。抱歉,我的回答确实在问题的 1. 处看到了“&lt”编辑垃圾。
猜你喜欢
  • 2012-06-11
  • 2020-04-16
  • 1970-01-01
  • 2010-12-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多