在 tomcat 中部署战争后,Java 文本规范化的行为有所不同

Posted

技术标签:

【中文标题】在 tomcat 中部署战争后,Java 文本规范化的行为有所不同【英文标题】:Java text normalization behaving differently after deploying the war in tomcat 【发布时间】:2018-08-07 15:37:39 【问题描述】:

我正在尝试规范化具有重音字符的字符串。它在我的 intellij IDE 上运行良好,但是当我使用 maven 构建它并在 tomcat 中部署战争时,我得到了这样的意外结果。你能帮忙吗?

要规范化的 Java 代码

String normalizedString = Normalizer.normalize(inputText, Normalizer.Form.NFD).replaceAll("[^\\pASCII]", "");

tomcat 日志的输出:

Input text = ůňa
Normalized String = AAa

当我在 IDE 中的本地计算机上运行相同代码时的输出

Input text = ůňa
Normalized String = una

我需要在某处指定一些编码设置吗?

我的专家有这个:

#<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>$maven-compiler-plugin.version</version>
<configuration>
<source>$java.version</source>
<target>$java.version</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>

这存在于我在 tomcat 中的 server.xml 中

  <Connector port="8443" 
  protocol="org.apache.coyote.http11.Http11NioProtocol"
  SSLEnabled="true"
  maxThreads="150"
  scheme="https"
  secure="true"
  clientAuth="false"
  sslProtocol="TLS" 
  URIEncoding="UTF-8"
  />

【问题讨论】:

【参考方案1】:

我能够解决这个问题。我正在从文件中读取数据,并且在读取文件时未提及编码。一旦我提出,问题就解决了

private static String inputStreamToString(InputStream is) throws IOException 
    StringBuilder sb = new StringBuilder();
    String line;
    BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
    while ((line = br.readLine()) != null) 
        sb.append(line);
    
    br.close();
    return sb.toString();



【讨论】:

以上是关于在 tomcat 中部署战争后,Java 文本规范化的行为有所不同的主要内容,如果未能解决你的问题,请参考以下文章

Tomcat 上的战争部署需要很长时间

如何读取部署在 Tomcat 中的未爆炸战争文件中的资源文件?

在 osgi 文件夹中复制后,Liferay 7 tomcat 中的战争在哪里爆炸

java.net.socketexception 连接重置由对等套接字写入错误通过 Jenkins 在 Tomcat7 上部署战争时(使用 Maven)

将启用 SSL 的 Java SpringBoot 战争部署到外部 Tomcat 服务器

Tomcat 8 Unicode 文件名战争文件部署问题