You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apache Tomcat v8.5部署Jakarta EE应用后阿拉伯语乱码问题求助

阿拉伯文乱码问题解决方案

核心问题排查与修复步骤

  • 1. 修复输入流读取的编码指定

    你的convertStreamToString方法中InputStreamReader没有显式指定UTF-8编码,会默认使用服务器操作系统的默认字符集,本地环境默认字符集可能为UTF-8所以运行正常,线上环境如果默认字符集不是UTF-8就会出现乱码。
    修改后的代码:
    private String convertStreamToString(InputStream is) {
        // 显式指定输入流编码为UTF-8
        BufferedReader reader = new BufferedReader(new InputStreamReader(is, java.nio.charset.StandardCharsets.UTF_8));
        StringBuilder sb = new StringBuilder();
        String line = null;
        try {
            while ((line = reader.readLine()) != null) {
                sb.append(line).append("\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return sb.toString();
    }
    
  • 2. 删除错误的手动转码逻辑

    代码中cmremarks = new String(cmremarks.getBytes(),"UTF-8");是错误逻辑:getBytes()会使用系统默认字符集将字符串转成字节数组,若默认字符集不是UTF-8,这一步就已经丢失了特殊字符的信息,后续再转UTF-8也无法恢复,直接删除这一行即可。
  • 3. 替换Statement为PreparedStatement

    直接拼接SQL字符串不仅有SQL注入风险,也会受数据库连接字符集的影响,改为预编译语句可以自动处理字符编码,避免拼接过程中的编码丢失:
    修改后的插入逻辑:
    // 删掉原来的Statement创建和拼接SQL逻辑
    String sqlQuery3 = "insert into test(COL1) values(?)";
    PreparedStatement pstmt = dbConnection.prepareStatement(sqlQuery3);
    pstmt.setString(1, cmremarks);
    int count = pstmt.executeUpdate();
    // 后续关闭资源时记得关闭pstmt
    
  • 4. 补充Oracle JDBC连接的字符集参数

    检查你的DBConnection类中的JDBC连接配置,在连接URL后追加编码参数:
    jdbc:oracle:thin:@//你的数据库地址:端口/服务名?useUnicode=true&characterEncoding=UTF-8
    
    同时确认Oracle数据库的字符集为AL32UTF8,存储阿拉伯文的字段类型优先使用NVARCHAR2。
  • 5. 配置Tomcat JVM默认字符集

    线上Tomcat添加JVM启动参数,强制指定默认字符集为UTF-8:
    • Linux环境:修改bin/catalina.sh,在文件开头添加:
      JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8"
      
    • Windows环境:修改bin/catalina.bat,在文件开头添加:
      set JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8
      
  • 6. 补全server.xml配置

    你的server.xml中只给HTTP连接器加了URIEncoding="UTF-8",还需要给AJP连接器也添加,同时追加useBodyEncodingForURI="true"参数:
    <Connector connectionTimeout="20000" port="8080" maxHttpHeaderSize="65536" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8" useBodyEncodingForURI="true"/>
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8" useBodyEncodingForURI="true"/>
    

内容的提问来源于stack exchange,提问作者Waqas Farooq

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 14:24:03