程式扎記: [ Java 常見問題 ] Stackoverflow : how to encode URL to avoid special characters in java

標籤

2014年6月30日 星期一

[ Java 常見問題 ] Stackoverflow : how to encode URL to avoid special characters in java

來源自 這裡
Question:
I need java code to encode URL to avoid special characters such as spaces and % and & ...etc

Answer:
URL construction is tricky because different parts of the URL have different rules for what characters are allowed: for example, the plus sign is reserved in the query component of a URL because it represents a space, but in the path component of the URL, a plus sign has no special meaning and spaces are encoded as "%20".

RFC 2396 explains (in section 2.4.2) that a complete URL is always in its encoded form: you take the strings for the individual components (scheme, authority, path, etc.), encode each according to its own rules, and then combine them into the complete URL string. Trying to build a complete unencoded URL string and then encode it separately leads to subtle bugs, like spaces in the path being incorrectly changed to plus signs (which an RFC-compliant server will interpret as real plus signs, not encoded spaces).

In Java, the correct way to build a URL is with the URI class. Use one of the multi-argument constructors that takes the URL components as separate strings,


and it'll escape each component correctly according to that component's rules. The toASCIIString() method gives you a properly-escaped and encoded string that you can send to a server. To decode a URL, construct a URI object using the single-string constructor and then use the accessor methods (such as getPath()) to retrieve the decoded components.

Don't use the URLEncoder class! Despite the name, that class actually does HTML form encoding, not URL encoding. It's not correct to concatenate unencoded strings to make an "unencoded" URL and then pass it through a URLEncoder. Doing so will result in problems (particularly the aforementioned one regarding spaces and plus signs in the path). Below is the sample code:
  1. URI uri1 = new URI("http""abc.com.tw:8080""/path/john .html""name=john&age=18""");  
  2. System.out.printf("%s\n", uri1.toASCIIString()); // Encode  
  3. // Decode  
  4. System.out.printf("\t[Info] Scheme='%s'\n", uri1.getScheme());  
  5. System.out.printf("\t[Info] Port='%d'\n", uri1.getPort());  
  6. System.out.printf("\t[Info] Host='%s'\n", uri1.getHost());  
  7. System.out.printf("\t[Info] Path='%s'\n", uri1.getPath());  
  8. System.out.printf("\t[Info] Query='%s'\n", uri1.getQuery());  
  9. System.out.printf("\t[Info] Fragment='%s'\n", uri1.getFragment());  
  10. URI uri2 = new URI("https://tw-mg31.mail.yahoo.com/neo/launch?.rand=60qu1ck5a44dr");  
  11. System.out.printf("%s\n", uri2.toASCIIString()); // Encode  
  12. // Decode  
  13. System.out.printf("\t[Info] Scheme='%s'\n", uri2.getScheme());  
  14. System.out.printf("\t[Info] Port='%d'\n", uri2.getPort());  
  15. System.out.printf("\t[Info] Host='%s'\n", uri2.getHost());  
  16. System.out.printf("\t[Info] Path='%s'\n", uri2.getPath());  
  17. System.out.printf("\t[Info] Query='%s'\n", uri2.getQuery());  
  18. System.out.printf("\t[Info] Fragment='%s'\n", uri2.getFragment());  
輸出結果:


1 則留言:

  1. Thanks for sharing, nice post!
    - Võng tự đưa hay thiet bi dua vong tu dong ngày càng trở thành 1 phần của các gia đình Việt. Máy dua vong tu dong nhỏ gọn, tiện lợi, tiết kiệm điện. Võng tự động hay máy đưa võng không những là phương pháp ru con thời hiện đại của các ông bố bà mẹ bận rộn.
    - Hiện nay trên thị trường có nhiều loại võng đưa em bé với giá cả và chất lượng khác nhau, việc lựa chọn may dua vong chất lượng, uy tín, giá cả hợp lý là quan tâm hàng đầu của các bậc phụ huynh. Với nhãn hiệu uy tín, sản phẩm vong ru tu dong cho be chất lượng và giá bán phải chăng, may dua vong em be An Thái Sơn tự hào là địa chỉ bán may dua vong gia re uy tín nhất cho bé.
    Chia sẻ các bạn kinh nghiệm mẹo giúp trẻ hết biếng ăn hay hay cách nào giúp bé ăn ngon miệng hơn, chia sẻ các bạn bệnh viêm khớp ở trẻ em: Phát hiện sớm tránh tàn phế, bạn cần ăn gì để nhanh liền sẹo cho những vết thương, thực phẩm giải độc gan hay ăn gì để giải độc cho gan, chia sẻ những cách chống nắng cho bé hiệu quả nhất, nguyên nhân và cách chữa trị bệnh rụng tóc ở trẻ em, các mẹ thắc mắc có nên uống collagen khi đang cho con bú hay không, đông trùng hạ thảo và những cách chế biến đông trùng hạ thảo nguyên con, mách các mẹ bí quyết giúp bé ngủ ngon giấc hay nguyên nhân và cách trị chứng mất ngủ ở trẻ em hay chia sẽ những thực phẩm không nên ăn khi thiếu máu não các bạn nên chú ý hay thực phẩm cho người bị rối loạn tiền đìnhngười bị rối loạn tiền đình không nên ăn gì
    Những thực phẩm giúp đẹp da tại http://nhungthucphamgiupda.blogspot.com/
    Thực phẩm giúp bạn trẻ đẹp tại http://thucphamgiuptre.blogspot.com/
    Thực phẩm làm tăng tại http://thucphamlamtang.blogspot.com/
    Những thực phẩm giúp làm giảm tại http://thucphamlamgiam.blogspot.com/

    回覆刪除

網誌存檔

關於我自己

我的相片
Where there is a will, there is a way!