在探讨编码与解码之前,让我们先明确一些基本概念。
何为`application/x-www-form-urlencoded`字符串?简而言之,这是一种特定的编码类型。当URL中包含非西欧字符的字符串时,系统会自动将这些字符转换成`application/x-www-form-urlencoded`格式的字符串。在表单提交时,若包含非西欧字符的字符串,同样也会进行此转换。
当需要发送大量文本、包含非ASCII字符的文本或二进制数据时,这种编码方式的效率就会大打折扣。我们便会采用另一种编码类型——“multipart/form-data”。例如,在文件上传时,表单的enctype属性通常会设置为“multipart/form-data”。
当网页中的表单使用POST方法进行数据提交时,数据内容的类型通常是`application/x-www-form-urlencoded`。这种类型有一些特定的转换规则:
1. 字母"a"至"z","A"至"Z","0"至"9",".","-","",和"_"不会被编码。
2. 空格字符会被转换为加号 (+) 。
3. 非文本内容会被转换成"%xy"的形式,其中xy是两位16进制的数值。
4. 每个name=value对之间会放置&符号以分隔。
`URLEncoder`类包含将字符串转换为`application/x-www-form-urlencoded` MIME格式的静态方法。
在Web设计过程中,处理不同操作系统间的差异是一个重要的挑战。这些差异可能会导致URL方面的问题。例如,某些操作系统允许文件名中包含空格符,而其他系统则不允许。大多数操作系统不会认为文件名中的符号“”具有特殊含义,但在URL中,符号“”表示文件名结束,并紧跟一个fragment(部分)标识符。其他特殊字符在URL或其他操作系统中可能有其特定的含义。为了解决这些问题,我们在URL中使用的字符必须是ASCII字符集中的一部分。
值得注意的是,有些特殊字符如冒号(:)、问号(?)、井号()等,虽然可以被URL使用,但具有特定的含义。当这些字符作为文件名的一部分而非URL各部分之间的分隔符时,应该被编码以避免混淆或误解。
关于编码和解码的过程,需要注意,自动编码或解码并不总是发生。程序员有责任确保用于生成URL对象的字符串已经过适当的编码处理。幸运的是,Java提供了`URLEncoder`和`URLDecoder`这两个类来处理字符串的编码和解码工作。这两个类均不需要初始化即可使用。
特别地,Java 1.3及早期版本中的`URLEncoder`类提供了一种简单的静态方法来对字符串进行编码。这个方法使用了当时所在平台的默认编码形式,这意味着在不同的系统上可能会产生不同的结果。为了解决这一问题,Java 1.4对`URLEncoder`进行了改进,提供了要求程序员自行指定编码形式的方法。