Java Web表单提交后重音字符匹配失败问题求助
问题分析
核心问题出在前端使用escape()函数编码重音字符,以及后端参数解码、正则匹配的编码一致性上:
escape()对重音字符(如à)会编码为%u00E0,这种编码格式并非标准UTF-8的%C3%A0,后端直接用request.getParameter()获取时,即使设置了UTF-8编码,也无法正确解码,导致字符变成?。- 数据库以
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
相关产品推荐
相关产品推荐

