使用JS+Spring开发时输入连字符存入Oracle变为问号如何解决?
问题根因
你遇到的是非ASCII字符全链路编码不匹配+前端代码bug共同导致的问题,具体如下:
1. 前端替换逻辑完全失效
你写的denominacionComercial.replace('–','-')是错误写法:JavaScript的String.replace()方法不会修改原字符串,只会返回替换后的新字符串,你没有把返回值赋值回原变量,所以长破折号(en dash,Unicode U+2013的–)根本没有被替换成普通ASCII短横(ASCII 45的-),非ASCII字符被直接提交到了后端。
修改方案:把对应代码改为:
if(denominacionComercial.includes('–')){ denominacionComercial = denominacionComercial.replace('–','-'); console.log("DESPUÉS " + denominacionComercial); }
你可以直接看控制台的DESPUÉS输出,就能确认替换之前没有生效。
2. 全链路字符集不统一
没有被替换的长破折号属于多字节Unicode字符,只要前端、Spring服务、数据库连接、Oracle数据库任意一个环节的字符集不兼容UTF-8,就会被转成乱码¿。
排查修复步骤
- 前端页头确保配置了
<meta charset="UTF-8">,保证请求提交时用UTF-8编码 - Spring配置文件添加强制UTF-8编码配置:
spring.http.encoding.charset=UTF-8 spring.http.encoding.force=true spring.http.encoding.enabled=true
- 检查Oracle JDBC连接串,补充UTF-8编码参数:
jdbc:oracle:thin:@//你的数据库地址:端口/服务名?useUnicode=true&characterEncoding=UTF-8
- 确认Oracle数据库字符集支持UTF-8,执行SQL查询:
SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER = 'NLS_CHARACTERSET';
如果返回结果不是AL32UTF8,说明数据库本身不支持存储多字节Unicode字符,需要调整数据库字符集。
- 可以在Spring Controller接收参数时打印日志,如果此时参数已经是乱码,说明问题出在前端到Spring的链路;如果参数正常,说明问题出在Spring到数据库的链路,快速缩小排查范围。
内容的提问来源于stack exchange,提问作者okjfokjrf
相关产品推荐
相关产品推荐

