在各种开放平台、OpenAPI越来越多之时,客户端软件或多或少的在通过HTTP、HTTPS协议与服务器交互。这其中一个常见的情况就是要求对URL进行encode处理,以保证中文、特殊字符的正确传递。不过这个小小的encode也没想象中的那么单纯。
前几日在Android开发中遇到一例时,URL中的空格符(ASCII码是0x20),在经过java.net.URLEncoder类encode以后,会变成+号,而不是%20,从而造成了server不能正确识别。
经查,URLEncode有两个方法:
public static String encode (String s,String charsetName)
Encodes s using the Charset named bycharsetName.
public static String encode (String s)
Equivalent to encode(s, "UTF-8").
第二个方法已经从Android API 1起就被弃用了,建议使用第一种方法显示的指定字符集为UTF-8,并且该编码是将空格符编码为+,而不是%20。当然,这是符合URL规范的,见RFC-1738。
要想将空格符编码为%20,就要用另一种encode,即android.net.Uri类,该类使用RFC-2396标准。语法如下:
public static String encode (String s)
Encodes characters in the given string as'%'-escaped octets using the UTF-8 scheme. Leaves letters ("A-Z","a-z"), numbers ("0-9"), and unreserved characters("_-!.~'()*") intact. Encodes all other characters.
当进行网络相关的接口实现时,还是要认真了解具体的区别,同时也建议开放平台的文档中能尽量清晰的描述协议约定,以免给开发和调试带来困难。试想,如果不是恰巧发现了这个问题,得经过多少测试才能发现这个bug呢?
至于URL与URI的区别,参见百度百科吧。
——欢迎转载,请注明出处 http://blog.csdn.net/caowenbin ——