如何从JavaScript原样向Java传递HTML签名及特殊符号处理
解决特殊符号™、®的编码/乱码问题
我之前也踩过类似的特殊符号编码坑,给你梳理下问题根源和对应的解决办法:
问题1:编码后%被转为%25
这是重复URL编码搞的鬼。比如你手动用encodeURIComponent("value™")得到了value%E2%84%A2,但如果你的HTTP请求框架(比如Axios、jQuery.ajax)或者后端服务器又自动对请求参数做了一次URL编码,就会把%再编码成%25,最终变成value%25E2%84%A2,后端解析自然就不对了。
解决办法:
- 优先让请求库自动处理:大部分现代HTTP库(比如Axios)默认会用UTF-8编码参数,直接传递原始字符串就行,比如
params: { key: "value™" },不用手动编码。 - 如果必须手动编码,要确保后端不会二次编码:比如后端是Spring Boot,检查是否有重复编码的配置;或者后端接收时用
URLDecoder.decode(param, "UTF-8"),但注意不要重复解码。
问题2:直接传递未编码的字符到Java变成乱码
这是前后端字符编码不一致导致的。前端发送请求时用UTF-8编码,但后端没配置成UTF-8来解析请求参数,字节流被错误解码就会出现乱码。
解决办法:
后端(Java)配置
- Spring Boot项目:在
application.properties里添加强制UTF-8编码的配置:server.servlet.encoding.force=true server.servlet.encoding.charset=UTF-8 server.servlet.encoding.enabled=true - 传统Servlet项目:在
web.xml中配置编码过滤器:<filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> - 手动兜底解码:如果上面的配置没生效,获取参数时可以手动转码(Tomcat默认用ISO-8859-1解析参数):
String rawParam = request.getParameter("key"); String decodedParam = new String(rawParam.getBytes("ISO-8859-1"), "UTF-8");
前端注意事项
- 确保页面编码是UTF-8:在HTML头部加
<meta charset="UTF-8">。 - 发送POST请求时,确认请求头包含
Content-Type: application/x-www-form-urlencoded; charset=UTF-8(大部分请求库会自动处理,手动写AJAX时要留意)。
快速验证方案
用Postman直接发送参数key=value™,如果后端能正常解析,说明问题大概率出在前端的编码逻辑或者后端的编码配置上,针对性调整即可。
内容的提问来源于stack exchange,提问作者Navneet Mathpal
相关产品推荐
相关产品推荐

