【问题标题】:Escape % symbol in a java string to apply String.format在 java 字符串中转义 % 符号以应用 String.format
【发布时间】:2013-09-20 18:22:06
【问题描述】:

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

当用户输入一个%符号时,这个逻辑就中断了,因为错误显示逻辑使用了

String.format(message, messageArgs);

将 messageArgs 插入到找到 % 的消息字符串中,如果 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!)

谢谢!

【问题讨论】:

  • 你能显示错误信息吗?我认为%messageArgs 中的存在不会有任何问题。
  • 你能发布一个输入失败的例子吗?
  • 准备好刚刚编辑的帖子
  • 使用String#format会出问题
  • 我不明白你的意思@archer

标签: java string string.format input-sanitization


【解决方案1】:

message 字符串中,% 符号用另一个 % 转义。所以你需要加倍:%%
例如:“Bla bla %i bla”->“Bla bla %%i bla”
messageArgs字符串中,%符号没有问题,不需要转义

【讨论】:

    【解决方案2】:

    当需要打印字符串%时,在格式化字符串中使用%%

    String.format("sendOneSuccessCountRate: %7.2f%%"
                  ,sendOneSuccessCountRate //0.95
                 );
    

    会给你95.00%

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-10
        • 1970-01-01
        • 2011-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-24
        相关资源
        最近更新 更多