Java URLDecoder解码百分号报错

3
我需要允许用户输入各种特殊字符,所以我使用了Java中的URLDecoder.decode()方法,在测试时使用了println。除了百分号这个特殊字符之外,其他特殊字符都没有问题,但执行时出现了错误。这是为什么呢?我知道%用于URL编码,这是原因吗?
java.lang.IllegalArgumentException: URLDecoder:不完整的尾随转义(%)模式
System.out.println(URLDecoder.decode("%", "UTF-8"));

百分号是编码值的开头,你也需要知道这个值。例如,%20代表空格。 - Elliott Frisch
@ElliottFrisch,是的,我注意到了,但有没有什么解决方法可以让用户输入%? - hades
1
定义“特殊字符”。请注意,URLDecoder用于解码“application/x-www-form-urlencoded”数据,这可能不是您想要的。 - fge
@fge 那些可以在键盘上找到的非字母数字字符 - hades
2个回答

1
尽管它们的名称为URLEncoder/Decoder,但它们用于编码POST参数,而不是URL。请参见@fge的下面的评论。
编码URL的方法是使用URL和URI类。
我很好奇您首先是如何获得未解码的URL的。

实际上,我不是用它来解码URL,而是用它来解码文本字段中的用户输入,因为如果用户输入这些字符!@#$%^&*(),它们将以未解码的值存储在数据库中,例如%26等。 - hades
那么你完全是相反的。你要找的过程是“编码”,而不是解码。 - user207421
那么在文本字段和数据库之间一定发生了其他进程,但您没有告诉我们。不清楚您的问题是什么。 - user207421
"URLEncoder/Decoder 用于编码 URL 参数" <-- 这是错误的。这些类旨在编码 application/x-www-form-urlencoded 数据,这并不完全相同。 - fge
不,它们并不是。如果你所说的“arguments”指的是“query string”,那么不; 主要区别在于空格(在URL中为“%20”,但在表单数据中为“+”)。有关详细信息,请参阅RFC 3986。同时搜索URI模板(这是一个RFC; 我有它的实现)。 - fge
显示剩余3条评论

0

% 标记了编码字符的开始。它应该后跟一些十六进制数字。否则,它将抛出 IllegalArgumentsException,并且它的工作方式符合预期,因为您没有在 % 后指定十六进制数字。请参考 http://www.w3schools.com/tags/ref_urlencode.asp 以获取更多详细信息。如果您希望输出为 '%',则需要执行


System.out.println(URLDecoder.decode("%25", "UTF-8"));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接