如何确定字符串是否已经过URL编码?

Tri*_*ick 47 java utf-8 url-encoding

我怎么能检查字符串是否已被编码?

例如,如果我编码TEST==,我得到TEST%3D%3D.如果我再次编码最后一个字符串,我得到TEST%253D%253D,如果它已经编码,我必须知道它...

我已经保存了编码参数,我需要搜索它们.我不知道输入参数,它们是什么 - 编码与否,所以我必须知道在搜索之前是否必须对它们进行编码或解码.

SF.*_*SF. 41

解码,与原始相比.如果它确实不同,则原始编码.如果没有差异,则不对原始编码进行编码.但它仍然没有说明新解码的版本是否仍未编码.递归的好任务.

我希望你不能在urlencode中写一个quine,否则这个算法就会卡住.

  • 如果你的字符串包含像`%DESCRIPTION%`这样的windows变量名,它会解码为`ÞSCRIPTION%`或'%ABOUT%`,它变为``OUT%`,这就失败了. (6认同)
  • 这是磨损的。当字符串包含“+”字符时,即使字符串不是 url 编码的,url 解码器也会用空格替换它。见 http://docs.oracle.com/javase/6/docs/api/java/net/URLDecoder.html (5认同)
  • 如果原始字符串包含加号,则不起作用。你解码它,和原来的比较,字符串是不同的。+ 已替换为空格。你最终没有编码它,即使你应该。 (4认同)
  • @SF.:如果初始未编码的字符串在中间包含一个+字符,则会失败.解码后的字符串将包含空格字符,但不会相等.更好的方法是比较长度.如果原始字符串大于解码的字符串,则原始编码. (3认同)

Rom*_*man 15

使用regexp检查您的字符串是否包含非法字符(即在URL编码的字符串中找不到的字符,如空格).

  • 那么你将如何区分"hello%20world"和"interest20%增长"?第一个是有效的urlencoded字符串,另一个是必须转义的字符串,不会生成有效的unescape. (9认同)
  • 检查非法字符不包括百分比符号,因为它只是被转义是非法的.当您检查百分比符号时,**可能*具有URI编码的字符串,如果后跟"25".仅当您知道输入未被编码或编码正好1次*并且*输入自然不包括URI编码生成的序列时,此方法才有效. (2认同)
  • 如果一个字符串包含无效字符,你可以证明它没有被编码,但如果它只包含有效字符和百分号,那不能证明它被编码。这是不可知的。因此,这可能是您实际所能做的最好的检查。 (2认同)

ami*_*ena 5

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

# 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
Run Code Online (Sandbox Code Playgroud)