2010-02-19 141 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 
相關問題