如何解决 Java Web 应用在向第三方服务传送中文时出现乱码的问题

问题描述

部署在 Azure 上的 Web APP 应用在向第三方传送中文字符串时,第三方服务接受到的是类似于 ?? 之类的乱码,而本地运行发送是正常的。

问题分析

这是因为 APP Service 环境的默认编码为 GBK ,在向第三方发送数据时要做默认的转码工作,即执行 new String (“您要传送的字符串”.getBytes(),”UTF-8”) ,而 getBytes 方法如果没有参数的话会使用系统默认的编码方式编码, gbk 编码和 utf-8 编码方式不同,所以在转换之后会出现乱码的现象。

解决方法

若要解决这个问题,在 site/wwwroot 文件夹下创建 web.config 文件(如果已经有请直接修改),添加以下内容,主要目的时修改 jvm 的默认编码方式,修改成 utf-8 保证传输中编码不会出错:

<configuration>
  <system.webServer>
    <handlers>
      <add name="httpPlatformHandler" path="*" verb="*" modules="httpPlatformHandler" resourceType="Unspecified" />
    </handlers>
    <httpPlatform processPath="%AZURE_TOMCAT85_HOME%\bin\startup.bat" arguments="">
      <environmentVariables>
        <environmentVariable name="JAVA_OPTS" value="-Djava.net.preferIPv4Stack=true -Dfile.encoding=UTF-8" />
      </environmentVariables>
    </httpPlatform>
  </system.webServer>
</configuration>

参考文档

如何设置 Java 默认字符编码 Setting the default Java character encoding?