【发布时间】:2015-12-04 15:05:46
【问题描述】:
我需要转义 String 中的特殊字符。
Guava 提供了 Escaper 类,它正是这样做的:
Escaper escaper = Escapers.builder()
.addEscape('[', "\\[")
.addEscape(']', "\\]")
.build();
String escapedStr = escaper.escape("This is a [test]");
System.out.println(escapedStr);
// -> prints "This is a \[test\]"
现在我有一个转义的String,我需要取消转义,但我在 Guava 中找不到任何东西来执行此操作。
我期待 Escaper 有一个 unescape() 方法,但事实并非如此。
编辑:我知道取消转义可能很棘手,在某些无意义的情况下甚至是不可能的。
例如,这种Escaper 用法可能会导致歧义:
Escaper escaper = Escapers.builder()
.addEscape('@', " at ")
.addEscape('.', " dot ")
.build();
除非转义的数据仅包含电子邮件地址,否则您无法通过取消转义来安全地取回数据。
安全使用Escaper 的一个很好的例子是 HTML 实体:
Escaper escaper = Escapers.builder()
.addEscape('&', "&")
.addEscape('<', "<")
.addEscape('>', ">")
.build();
在这里,您可以安全地转义任何文本,将其合并到 HTML 页面中并随时取消转义以显示它,因为您涵盖了所有可能的歧义。
总之,我不明白为什么取消转义如此有争议。我认为正确使用这个类,了解他的数据并避免歧义是开发人员的责任。 逃避,顾名思义,意味着你最终需要逃避。否则就是混淆或其他概念。
【问题讨论】: