我在使用 Apache commons 的 URLCodec 解码像“1º”这样的数据时面临一个问题。它被解码为“1?”。
这个问题有什么解决办法吗?
在我尝试使用以下代码之前:
String decodedData = new URLCodec().decode(data, "ISO-8859-1");
我也尝试过使用下面的代码。但这没有帮助。
String decodedData = new URLCodec().decode(data, "UTF-8");
我在使用 Apache commons 的 URLCodec 解码像“1º”这样的数据时面临一个问题。它被解码为“1?”。
这个问题有什么解决办法吗?
在我尝试使用以下代码之前:
String decodedData = new URLCodec().decode(data, "ISO-8859-1");
我也尝试过使用下面的代码。但这没有帮助。
String 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
如果您采用编码形式,并将其通过解码器,您应该得到未编码的形式。但是,当您使用未编码的版本并尝试对其进行解码时,没有定义会发生什么。由于未定义,实际实现和实际结果可能会有所不同。它可能应该将异常作为无效编码抛出,但这也不能保证。