代码之家  ›  专栏  ›  技术社区  ›  Trick

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

  •  42
  • Trick  · 技术社区  · 15 年前

    如何检查字符串是否已编码?

    例如,如果我编码 TEST== 我得到 TEST%3D%3D . 如果我再次编码最后一个字符串,我会得到 TEST%253D%253D 如果它已经被编码了的话,在做之前我必须知道…

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

    7 回复  |  直到 6 年前
        1
  •  36
  •   SF.    15 年前

    解码,与原稿比较。如果确实不同,则对原始文件进行编码。如果没有区别,则不会对原始文件进行编码。但它仍然没有说明新解码的版本是否仍然是编码的。递归的好任务。

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

        2
  •  14
  •   Roman    15 年前

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

        3
  •  4
  •   Padmarag    15 年前

    Joel on Software早就有了解决方案- http://www.joelonsoftware.com/articles/Wrong.html
    或者可以在字符串中添加一些前缀。

        4
  •  3
  •   flybywire    15 年前

    你不能确定,除非你的弦符合某种模式,或者你跟踪你的弦。正如您自己所指出的,编码的字符串也可以被编码,所以您不能通过查看字符串本身来100%确定。

        5
  •  3
  •   amit_saxena    9 年前

    尝试解码URL。如果结果字符串比原始字符串短,则原始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
    
        6
  •  0
  •   jschnasse    6 年前

    检查您的URL是否有可疑字符[1]。 候选人名单:

    WHITE_SPACE ,", < , > , { , } , | , \ , ^ , ~ , [ , ] , . 和`

    我使用:

    private static boolean isAlreadyEncoded(String passedUrl) {
            boolean isEncoded = true;
            if (passedUrl.matches(".*[\\ \"\\<\\>\\{\\}|\\\\^~\\[\\]].*")) {
                    isEncoded = false;
            }
            return isEncoded;
    }
    

    对于实际编码,我继续执行以下操作:

    https://stackoverflow.com/a/49796882/1485527

    注释 :即使您的URL不包含您可能希望应用的不安全字符,例如对主机名进行punnycode编码。所以还有很大的空间进行额外的检查。


    [1]候选人名单可在 URL spec 在第2页。 在我的理解中,在编码检查中应该省略“%”或“”,因为这些字符也可以出现在编码的URL中。

        7
  •  0
  •   esergion    6 年前

    如果您想确保字符串编码正确(如果需要编码),只需解码并再次编码。

    metacode:

    100%_correctly_encoded_string = encode(decode(input_string))
    

    已编码的字符串将保持不变。将对未编码的字符串进行编码。只有URL允许的字符的字符串也将保持不变。