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

Java Web表单提交后重音字符匹配失败问题求助

问题分析

核心问题出在前端使用escape()函数编码重音字符,以及后端参数解码、正则匹配的编码一致性上:

  1. escape()对重音字符(如à)会编码为%u00E0,这种编码格式并非标准UTF-8的%C3%A0,后端直接用request.getParameter()获取时,即使设置了UTF-8编码,也无法正确解码,导致字符变成?。
  2. 数据库以latin1存储正则表达式中的重音字符,后端读取正则时若未按latin1转码,会导致正则中的重音字符本身乱码,无法匹配正确字符。
解决方案

1. 替换前端escape()为encodeURIComponent()

escape()已被废弃,且对非ASCII字符的编码不符合URI标准,改用encodeURIComponent()处理description字段:

// 原代码
var desc = escape(document.getElementById('description').value);
// 修改为
var desc = encodeURIComponent(document.getElementById('description').value);

该函数会将重音字符编码为标准UTF-8格式(如à→%C3%A0),后端可正确解码。

2. 确保后端参数解码的正确性

虽然已设置request.setCharacterEncoding("UTF-8"),但需确认过滤器执行顺序:

  • 确保CharacterEncodingFilter在所有其他过滤器(包括Struts1的核心过滤器)之前执行,避免参数被提前解析。
  • 若使用JBoss EAP7.1,需在standalone.xml中配置HTTP连接器的编码,强制UTF-8:
<subsystem xmlns="urn:jboss:domain:undertow:3.1">
    <server name="default-server">
        <http-listener name="default" socket-binding="http" redirect-socket="https" 
                       encoding="UTF-8" decode-url="true"/>
    </server>
</subsystem>

3. 修正正则表达式的编码一致性

由于数据库以latin1存储正则,后端读取时需将其从latin1转码为UTF-8,避免正则中的重音字符乱码:

// 从数据库读取正则的代码示例
String regexFromDb = resultSet.getString("regex_pattern");
// 转码为UTF-8
String utf8Regex = new String(regexFromDb.getBytes("ISO-8859-1"), "UTF-8");
// 使用转码后的正则进行匹配
Pattern pattern = Pattern.compile(utf8Regex);
Matcher matcher = pattern.matcher(description);

同时,正则中的重音字符无需额外转义(原正则中的\\ò等转义是多余的,因为在字符类[]中这些字符不需要转义),可简化为[.\- %A-Za-z0-9òàìèéù'^]*(注意-放在字符类开头或结尾避免被解析为范围)。

4. 验证日志输出的编码

确保alpha.log的日志配置使用UTF-8编码,避免日志输出时字符乱码:
若使用Log4j,修改log4j.properties:

log4j.appender.file.Encoding=UTF-8

若使用JBoss自带的日志系统,在standalone.xml中配置:

<periodic-rotating-file-handler name="FILE" autoflush="true">
    <formatter>
        <pattern-formatter pattern="%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%e%n"/>
    </formatter>
    <file relative-to="jboss.server.log.dir" path="alpha.log"/>
    <encoding>UTF-8</encoding>
</periodic-rotating-file-handler>
验证步骤
  • 提交包含重音字符的内容,查看日志中sdescr是否显示正确字符。
  • 检查正则匹配是否返回MATCH而非NO_MATCH。
  • 确认数据存入数据库后,重音字符可正常显示(latin1支持这些西欧重音字符,无需修改数据库字符集)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 11:47:23