在java字符串中转义%符号以应用String.format

orl*_*ybg 8 java string string.format input-sanitization

在我的项目(Java/Play框架)中,我有一个错误处理路由,如果响应是错误代码,则检查来自Web服务的响应,我们显示相应的错误消息,说明用户输入有什么问题,服务检查用户输入有效性.

当用户输入%符号时,由于错误显示逻辑使用,该逻辑会中断

String.format(message, messageArgs);
Run Code Online (Sandbox Code Playgroud)

其中插入了messageArgs介绍它找到%的消息String,如果messageArgs包含%,那么我得到一个异常.

在显示消息之前,我需要清理,转义或以其他方式从用户输入中删除%.

消息:请求的电子邮件地址%s无效messageArgs:orlybg%@gmail.com

有关如何以最简单,最短的方式在Java中执行此操作的任何建议吗?

这是错误日志的一部分

 java.util.UnknownFormatConversionException: Conversion = 'i'
   at java.util.Formatter$FormatSpecifier.conversion(Formatter.java:2646)
   at java.util.Formatter$FormatSpecifier.<init>(Formatter.java:2675)
   at java.util.Formatter.parse(Formatter.java:2528)
   at java.util.Formatter.format(Formatter.java:2469)
   at java.util.Formatter.format(Formatter.java:2423)
   at java.lang.String.format(String.java:2797)
   at controllers.api.PublicAPI.renderAPIError(PublicAPI.java:176)
   at controllers.api.DeviceAPI.setEmailAddress(DeviceAPI.java:736)
   at play.mvc.ActionInvoker.invokeWithContinuation(ActionInvoker.java:557)
   at play.mvc.ActionInvoker.invoke(ActionInvoker.java:508)
   at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:484)
   at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:479)
   at play.mvc.ActionInvoker.invoke(ActionInvoker.java:161)
   at Invocation.HTTP Request(Play!)
Run Code Online (Sandbox Code Playgroud)

谢谢!

sta*_*tan 6

消息 String中,%符号与另一个%进行转义.所以你需要加倍:%%
例如:"Bla bla%i bla" - >"Bla bla %% i bla"
messageArgs字符串中,%符号没有问题,你不需要逃避它


Jas*_*key 5

%%当您需要打印 string 时,在 formatter string 中使用%

String.format("sendOneSuccessCountRate: %7.2f%%"
              ,sendOneSuccessCountRate //0.95
             );
Run Code Online (Sandbox Code Playgroud)

会给你 95.00%


Arc*_*her 1

如果您很可能在尝试格式化整数时java.util.UnknownFormatConversionException: Conversion = 'i'使用它,那么这是不正确的。您必须使用来格式化十进制整数。可以在此处找到完整支持的转换规范。%imessage%d