2010-02-19 140 views
39

如何检查字符串是否已被编码?如何找出字符串是否已经被URL编码?

例如,如果我编码TEST==,我得到TEST%3D%3D。如果我最后一个字符串再编码,我得到TEST%253D%253D,我不得不这样做,如果是已经编码...

我已编码的参数保存之前就知道了,我需要寻找他们。我不知道输入参数,它们会是什么 - 编码或不编码,所以我必须知道在搜索之前是否必须对它们进行编码或解码。

+0

同意。你接受了错误的答案。 – 2015-10-01 20:46:11

+0

import java.net.URI String url =“www.demo.demo/demo file not encoded.jpg” boolean isEncoded = true; 尝试{ \t URI x = new URI(url) } catch(Exception ex){ \t isEncoded = false; } – 2016-09-27 10:31:29

回答

33

解码,与原始对比。如果确实不同,则原始编码。如果不相同,则原始编码不被编码。但是它仍然没有说明新解码的版本是否仍然被编码。递归的一个很好的任务。

我希望不能在urlencode中写一个奎因,否则这个算法会卡住。

+0

你给了我这个想法,如何做到这一点。现在我的SQL看起来像'SELECT * FROM something WHERE param =“+ param +”OR param =“+ encode(param)' – Trick 2010-02-19 11:30:34

+0

你怎么知道你不需要''SELECT * FROM WHERE param =”+ param +“或param =”+ encode(param)+“OR param =”+ encode(encode(param))''? 这种方式是无限的倒退。 – sverkerw 2010-02-19 14:04:48

+1

很好,除了“足够好”的情况下是真的;如果0.01%的用户确实希望程序不能正常工作,那么这对他们不起作用。有时候额外的,极端的条款只是不值得的努力和开销。 – 2010-02-21 12:19:19

2

除非您的字符串符合某种特定模式,否则您无法确切知道,或者您记录了字符串。正如你自己提到的那样,编码的字符串也可以被编码,所以你不能通过查看字符串本身来100%确定。

14

使用正则表达式来检查您的字符串是否包含非法字符(即无法在URL编码字符串中找到的字符,如空格)。

+0

我没有这样做,但这是解决方案。 – Trick 2010-02-19 11:32:11

+9

那么如何区分'hello%20world'和'interest20%growth'?第一个是有效的urlencoded字符串,另一个是必须转义并且不会生成有效unescape的字符串。 – 2010-02-19 12:38:28

+2

检查非法字符不包含百分号,因为它不是非法的,只是被转义。当你检查百分号时,如果后面跟着“25”,你*可能会*有一个URI编码的字符串。这只有在你知道你的输入不是编码或编码一次*和*时,输入并不自然包含URI编码产生的序列。 – benrifkah 2012-03-27 20:02:41

4

Joel on software有一段时间的解决方案 - http://www.joelonsoftware.com/articles/Wrong.html
或者您可以为字符串添加一些前缀。

+2

也许更好:一个包装类型''struct QuotedString {char * str;}''可以传递,那么你可以__explicitly__(并且可以)混淆它的内部。 – sverkerw 2010-02-19 14:00:54

2

尝试解码网址。如果结果字符串比原始字符短,那么原始URL已经被编码,否则您可以安全地对其进行编码(不是编码,或者是编码后url保持不变,因此再次编码不会导致错误的url )。下面是伪代码样本(受红宝石启发)代码:

# Returns encoded URL for any given URL after determining whether it is already encoded or not 
    def escape(url) 
     unescaped_url = URI.unescape(url) 
     if (unescaped_url.length < url.length) 
     return url 
     else 
     return URI.escape(url) 
     end 
    end 
相关问题