java - Apache commons 的 URLCodec 解码数据并将字符替换为问号 (?)

标签 java urlencode apache-commons apache-commons-net

我在使用 Apache commons 的 URLCodec 解码像“1°”这样的数据时遇到一个问题。它被解码为“1?”。

这个问题有解决办法吗?

在我尝试使用以下代码之前:

字符串decodedData = new URLCodec().decode(data, "ISO-8859-1");

我也尝试过使用下面的代码。但这并没有帮助。

字符串decodedData = new URLCodec().decode(data, "UTF-8");

最佳答案

根据文档,解码函数是接收标准 URL,并从中解码出值。 www-form-urlencoded 编码值中只能包含一组指定的 ASCII 值。

您的问题表明您提交的 URL 值中包含的字符不在 www-form-urlencoded 的有效范围内。

答案是:我相信您正在尝试解码一个未正确 www-form-urlencoded 的值,这就是问题的根源。

您给出的值:1°,即数字 1,后跟“男性序数指示符”(假设编辑此 StackOverflow 条目时没有任何内容被扭曲)。阳性序数指示符的十进制值是 186,即十六进制值 00BA。

假设您将该值作为未编码数据开始,那么这两个字符序列的 www-form-urlencoded 值将取决于您使用的是 UTF-8 还是 ISO-8859-1。以下是每个的编码版本:

unencoded value:                           1º
www-form-urlencoded using ISO-8859-1 is:   1%BA
www-form-urlencoded using UTF-8 is:        1%C2%BA

如果您采用编码形式,并将其传递给解码器,您应该得到未编码的形式。但是,没有定义当您获取未编码版本并尝试对其进行解码时会发生什么。由于没有定义,实际实现和实际结果可能会有所不同。它可能应该抛出异常作为无效编码,但这也不能保证。

关于java - Apache commons 的 URLCodec 解码数据并将字符替换为问号 (?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14868837/

相关文章:

java - RegEx电子邮件验证

java - 添加元素后arraylist为空

c# - 用加号解码字符串

java - 使用 StringUtils 方法比 Java 方法运行得更快?

java - 如何在java中下载文件?

java - 在Java中通过FTP创建文件夹层次结构

java - Spring Boot 中的 Hibernate Validator 使用不同的 ConstraintValidatorManager

java - Facebook Graph api 通知发送抛出异常

objective-c - 希伯来字符的 iOS HTTP Post 编码

java - 是否可能与 URLEncoder 发生名称冲突